您的位置:首页 > 其它

hdu 1494 跑跑卡丁车

2015-08-15 16:39 369 查看
[b]hdu1494[/b]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1494
题目大意:中文的不用讲了吧。

分析:
这个题最主要的是注意卡丁车行驶过程中能量状态的变化,分析卡丁车的加速的规律
将加速与能量相结合,变成能量状态,最后分析此状态是如何得来,进行计算。
状态转移方程:加速f[i][j]=min(f[i][j],f[i-1][j+5]+b[i])
正常:f[i][j]=min(f[i][j],f[i-1][j-1]+a[i]).可以用线段图表示能量状态。


#include<iostream> #include<cstdio> #include<cstring> usingnamespacestd; #defineinf0x3f3f3f3f intl,n; intf[10005][15];//f[i][j]表示行驶完第i段该段能量状态为j的最小时间。 inta[10005],b[10005]; intminn(inta,intb) { returna<b?a:b; } voiddp() { memset(f,inf,sizeof(f)); f[0][0]=0; for(inti=1;i<=n*l;i++) { for(intj=0;j<15;j++)//看做背包容量,正常跑,加速跑为物品,正常跑+1,加速-5; { if(j==0) f[i][j]=f[i-1][j+5]+b[i]; else { f[i][j]=f[i-1][j-1]+a[i];//正常行驶 if(j==10)//当能量状态=14时,下一段的能量状态退回到j=10。 f[i][j]=minn(f[i][j],f[i-1][14]+a[i]); if(j<10) f[i][j]=minn(f[i-1][j+5]+b[i],f[i][j]); } } } } intmain() { intm; while(~scanf("%d%d",&l,&n)) { m=inf; for(inti=1;i<=l;i++) scanf("%d",&a[i]); for(inti=1;i<=l;i++) scanf("%d",&b[i]); for(inti=l+1;i<=n*l;i++) { a[i]=a[i-l]; b[i]=b[i-l]; } dp(); for(inti=0;i<15;i++) if(f[l*n][i]<m) m=f[l*n][i]; printf("%d\n",m); } return0; }

  


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: