poj 2336 Ferry Loading II dp

if(a>dp[i-j])dp[i]=min(dp[i],2*t+a);
else dp[i]=min(dp[i],2*t+dp[i-j]);

dp[i]表示第i个车到达对岸花的最少时间

由于第 i 个车可以和它前面的 j(1~n-1)个车一起坐船,所以可以得到dp[i]=min(dp[i],dp[i-j]+2*t);

但是第 i 个车到达的时间可能大于了dp[i-j],这样就会等第 i 个车,又得dp[i]=min(dp[i],i 到达时间+2*t);

最后一次不用返回了,所以dp[m]-t;

船运的次数:num[i]=num[i-j]+1;

View Code
#include <stdio.h>
#include <string.h>

int min(int a,int b)
{
return a<b?a:b;
}

int main()
{
int T,i,j,n,t,m,a,dp[1500],num[1500];
scanf("%d",&T);
while (T--)
{
scanf("%d%d%d",&n,&t,&m);
dp[0]=0;
memset(num,0,sizeof(num));
for (i=1;i<=m;i++)
{
scanf("%d",&a);
dp[i]=0x3f3f3f3f;
for (j=1;j<=n;j++)
{
if(i-j<0)break;
if(a>dp[i-j])dp[i]=min(dp[i],2*t+a);
else dp[i]=min(dp[i],2*t+dp[i-j]);
num[i]=num[i-j]+1;
}
}
printf("%d %d\n",dp[m]-t,num[m]);
}
return 0;
}



posted @ 2011-11-12 19:38  104_gogo  阅读(213)  评论(0编辑  收藏  举报