HDU-1494-跑跑卡丁车

题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=1494

状态方程推不出,这题,个人认为比较难,的经常看看

将氮气看成14个状态,14为2个卡与80% 
dp[i][j]表示为跑完第i段还剩j的最短时间,
if(k==0)               剩0是为冲过来的。
       dp[j][k]=dp[j-1][k+5]+b[j];
else if(k==10)      剩10有两种情况,从9过来 从14过来
       dp[j][k]=min(dp[j-1][14]+a[j],dp[j-1][9]+a[j]);
else if(k>10&&k<=14)   这时只能普通跑过来
       dp[j][k]=dp[j-1][k-1]+a[j];
else                                   两种选择
       dp[j][k]=min(dp[j-1][k-1]+a[j],dp[j-1][k+5]+b[j]);
 
 
代码

#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#define inf 0x3f3f3f3f
using namespace std;

int a[110];
int b[110];
int dp[110][20];

int main(void)
{
int i,j,k,l,n;
while(scanf("%d%d",&l,&n)==2)
{
for(i=1;i<=l;i++)
scanf("%d",a+i);
for(i=1;i<=l;i++)
scanf("%d",b+i);
memset(dp[0],inf,sizeof(dp[0]));
dp[0][0]=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=l;j++)
{
for(k=0;k<15;k++)
{
if(k==0)
dp[j][k]=dp[j-1][k+5]+b[j];
else if(k==10)
dp[j][k]=min(dp[j-1][9]+a[j],dp[j-1][14]+a[j]);
else if(k>10&&k<=14)
dp[j][k]=dp[j-1][k-1]+a[j];
else
dp[j][k]=min(dp[j-1][k-1]+a[j],dp[j-1][k+5]+b[j]);
}
}
for(j=0;j<15;j++)
dp[0][j]=dp[l][j];
}
int ans=inf;
for(i=0;i<15;i++)
ans=min(ans,dp[l][i]);
printf("%d ",ans);
}
return 0;
}

原文地址:https://www.cnblogs.com/liudehao/p/4143501.html