题面:

跑跑卡丁车
Problem Description
跑跑卡丁车是时下一款流行的网络休闲游戏,你可以在这虚拟的世界里体验驾驶的乐趣。这款游戏的特别之处是你可以通过漂移来获得一种
加速卡,用这种加速卡可以在有限的时间里提高你的速度。为了使问题简单化,我们假设一个赛道分为L段,并且给你通过每段赛道的普通耗时Ai和用加速卡的耗时Bi。加速卡的获得机制是:普通行驶的情况下,每通过1段赛道,可以获得20%的能量(N2O).能量集满后获得一个加速卡(同时能量清0).加速卡最多可以储存2个,也就是说当你有2个加速卡而能量再次集满,那么能量清零但得不到加速卡。一个加速卡只能维持一段赛道,游戏开始时没有加速卡。
问题是,跑完n圈最少用时为多少?

Input
每组输入数据有3行,第一行有2个整数L,N分别表示一圈赛道分为L段和有N圈赛道,接下来两行分别有L个整数Ai和Bi
(Ai > Bi).

Output
对于每组输入数据,输出一个整数表示最少的用时.

Sample Input
18 1
9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9 9
8 8 8 8 8 8 8 8 8 8 8 8 8 8 1 1 8 8

Sample Output
145

对于sample这组数据,你可以先在普通情况下行驶前14段,这时你有2个加速卡以及80%的能量(N2O).在第15和16段用掉2个加速卡,通过第
17段赛道后又可以得到一个加速卡,在第18段赛道使用.

分析:

一开始这道题可能看起来像贪心,但观察数据范围可知如果是贪心的话数据量不可能这么小,故采用DP的做法

  1. 划分子问题&确定状态:
    子问题:走到某个路段,有一定能量值时的时间
    子状态:很容易想到走到第几个路段,以及该路段的能量可以作为子状态,但是能量值为小数,而double类型不能作为dp数组的下标
    考虑到能量值每次增加20%,我们以20%为单位“1”,这样每一个能量卡能量值为5,能量槽最多存的能量为4,所以总能量最多为14
    因此我们只要用一个二维数组来存储状态即可

  2. 确定决策&写出状态转移方程
    我们定义dp[i][j] 表示走完第i段,能量值为j时的最短时间
    t[i].a表示第i段正常通过的时间,t[i].b表示第i段非正常通过的时间
    i显然是由i-1转移过来,但是j呢?
    我们对j进行分类讨论:
    当j=0j=0时,即能量恰好为0时肯定刚刚使用了一个加速卡,能量被清0(如果是已有2个加速卡,能量肯定大于10)
    因此dp[i][j]=dp[i-1][5]+t[i].b
    当0<j<100<j<10时 有两种可能,之前可能消耗了一个加速卡或者没消耗加速卡,因此dp[i][j]=min(dp[i-1][j-1]+t[i].a,dp[i-1][j+5]+t[i].b)
    当j=10j=10时也有两种可能,之前没消耗加速卡或者已有两个加速卡而能量被清0,因此dp[i][j]=min(dp[i-1][j-1]+t[i].a,dp[i-1][14]+t[i].a)
    当j>10j>10时只有一种可能,之前没消耗加速卡,因此dp[i][j]=dp[i-1][j-1]+t[i].a
    将上述四种情况综合起来,便可以写出以下的状态转移方程:
    dp[i][j]=dp[i][j]= ⎧⎩⎨⎪⎪⎪⎪⎪⎪dp[i−1][5]+t[i].b(j=0)min(dp[i−1][j−1]+t[i].a,dp[i−1][j+5]+t[i].b)(0<j<10)min(dp[i−1][j−1]+t[i].a,dp[i−1][14]+t[i].a)(j=10)dp[i−1][j−1]+t[i].a(j>10){dp[i−1][5]+t[i].b(j=0)min(dp[i−1][j−1]+t[i].a,dp[i−1][j+5]+t[i].b)(0<j<10)min(dp[i−1][j−1]+t[i].a,dp[i−1][14]+t[i].a)(j=10)dp[i−1][j−1]+t[i].a(j>10)

3.寻找边界条件
0<i<l×n0<i<l×n
0<j<150<j<15
但有一个细节需要注意:

  for(int i=1;i<maxe;i++) dp[0][i]=INF;//注意dp[0][0]是0,其余是INF

代码:

#include<iostream>
#include<cstring>
#define maxl 105
#define maxn 105
#define maxe 15 //最大储存能量5*2+4=14
#define INF 99999999
using namespace std;
int dp[maxn*maxl][maxe];
struct node{
int a;
int b;
}tim[maxn*maxl];
int l,n,ans;
int main(){
while(cin>>l>>n){
for(int i=1;i<=l;i++) cin>>tim[i].a;
for(int i=1;i<=l;i++) cin>>tim[i].b;
tim[0]=tim[l];
for(int i=l+1;i<=l*n;i++) tim[i]=tim[i%l];//将1圈之后的段也赋值
memset(dp,0,sizeof(dp));
for(int i=1;i<maxe;i++) dp[0][i]=INF;//注意dp[0][0]是0
for(int i=1;i<=l*n;i++){
for(int j=0;j<maxe;j++){
if(j==0) dp[i][j]=dp[i-1][5]+tim[i].b;
else if(j<10) dp[i][j]=min(dp[i-1][j-1]+tim[i].a,dp[i-1][j+5]+tim[i].b);
else if(j==10) dp[i][j]=min(dp[i-1][j-1]+tim[i].a,dp[i-1][14]+tim[i].a);
else if(j>10) dp[i][j]=dp[i-1][j-1]+tim[i].a;
}
}
ans=INF;
for(int i=0;i<maxe;i++){
ans=min(ans,dp[l*n][i]);
}
cout<<ans<<endl;
}
return 0;
}

HDU 1494 题解(DP)的更多相关文章

  1. HDU 5945 题解(DP)(单调队列)

    题面: Fxx and game Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) T ...

  2. HDU 1494 跑跑卡丁车 (DP)

    题目链接 题意 : 中文题不详述. 思路 : sum = L*N 段,每走过一段如果不用加速卡的话,能量会增20%,将20%看作1,也就是说每涨到15就要变为10,所以最多是14才不浪费. dp[i] ...

  3. HDU 3401 Trade dp+单调队列优化

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3401 Trade Time Limit: 2000/1000 MS (Java/Others)Mem ...

  4. B - Lawrence HDU - 2829 斜率dp dp转移方程不好写

    B - Lawrence HDU - 2829 这个题目我觉得很难,难在这个dp方程不会写. 看了网上的题解,看了很久才理解这个dp转移方程 dp[i][j] 表示前面1~j 位并且以 j 结尾分成了 ...

  5. hdu 4123 树形DP+RMQ

    http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...

  6. hdu 4507 数位dp(求和,求平方和)

    http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...

  7. hdu 3709 数字dp(小思)

    http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...

  8. hdu 4352 数位dp + 状态压缩

    XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  9. hdu 4283 区间dp

    You Are the One Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

随机推荐

  1. pycharm不支持svn,是需要svn命令行工具没有安装(for windows)

    1. 安装svn命令行工具 Subversion for Windows下载https://sourceforge.net/projects/win32svn/?source=typ_redirect ...

  2. import Vue form 'vue' 解释

  3. CSS定位机制之浮动定位float

    一.浮动定位实现的效果 二.使用float实现浮动定位 三.使用clear属性清除浮动定位 四.浮动定位的应用(布局) 一.浮动定位实现的效果   (一).块元素(div)在文档流中默认垂直排列,如果 ...

  4. java上传大文件(局域网环境)

    文件上传是最古老的互联网操作之一,20多年来几乎没有怎么变化,还是操作麻烦.缺乏交互.用户体验差. 一.前端代码 英国程序员Remy Sharp总结了这些新的接口 ,本文在他的基础之上,讨论在前端采用 ...

  5. leetcode打卡

    leetcode刷题打卡 刷题链接 夸夸群 刷题记录链接 期中颜色不一样的,是刷题中遇到问题的,以后需要强化 [x] 6.1 打卡 [x] 6.2 打卡 中间因个人原因没做题,后面慢慢补上 [x] 6 ...

  6. [BZOJ1478&1488&1815][SGU282]Isomorphism:Polya定理

    分析 三倍经验题,本文以[BZOJ1478][SGU282]Isomorphism为例展开叙述,主体思路与另外两题大(wan)致(quan)相(yi)同(zhi). 这可能是博主目前写过最长也是最认真 ...

  7. 如何快速优雅的解决:ORA-02290: 违反检查约束条件 异常问题

    在向oracle保存数据时,控制台报错如下: 很明显是保存时,该表的设计不允许某个字段非空导致的,但由于该表的数量较多,采用断点的方式有太过麻烦, 这里笔者采用 oracle 的客户端连接工具orac ...

  8. Elasticsearch的聚合操作

    ES的聚合: Metrics 简单的对过滤出来的数据集进行avg,max等操作,是一个单一的数值. bucket 可以理解为将过滤出来的数据集按条件分成多个小数据集,然后Metrics会分别作用在这些 ...

  9. JAVA 8 :从永久区(PermGen)到元空间(Metaspace)

    你注意到了吗?JDK 8早期可访问版本已经提供下载了,java 开发人员可以使用java 8 提供的新的语言和运行特性来做一些实验.其中一个特性就是完全的移除永久代(Permanent Generat ...

  10. Linux下使用 ipset 封大量IP及ipset参数说明

    转载Linux下使用 ipset 封大量IP及ipset参数说明 Linux使用iptables封IP,是常用的应对网络攻击的方法,但要封禁成千上万个IP,如果添加成千上万条规则,对机器性能影响较大, ...