找BUG找了好久呀~~都怪自己不注意细节~~
思路:dp[i][n]表示从第i辆车开始n个人最小用的钱
dp[i][n]=max(dp[i+1][n]+n*t[i+1],,,max(d+dp[i+1][n-l]+(n-l)*t[i+1]) (l<=z[i]&&l<=n)
#include <iostream>
#include <cstring>
#include <cstdio>
#define inf 9999999
using namespace std;
int t[2000];
int tt[2000];
int z[2000];
int zz[2000];
int dp[2000][2000];
int main()
{
int n,k,d,s;
int c;
scanf("%d",&c);
for(;c--;)
{
scanf("%d%d%d%d",&n,&k,&d,&s);
int i;
memset(z,0,sizeof(z));
memset(t,0,sizeof(t));
memset(zz,0,sizeof(zz));
memset(tt,0,sizeof(tt));
for(i=1;i<=k;i++)
{
scanf("%d%d",&tt[i],&z[i]);
t[i]=tt[i]-tt[i-1]; //就是这块~~本来tt[i]=tt[i]-tt[i-1];
}
zz[k]=z[k];
for(i=k-1;i>=1;i--)
zz[i]=z[i]+zz[i+1];
int j;
for(i=0;i<120;i++)
for(j=0;j<=120;j++)
dp[i][j]=inf;
for(i=1;i<=n;i++)
{
if(i<=z[k])
dp[k][i]=d;
else
dp[k][i]=inf;
//printf("%d %d %d\n",k,i,dp[k][i]);
}
dp[k][0]=0;
for(i=k-1;i>=1;i--)
{
dp[i][0]=0;
for(j=1;j<=n;j++)
{
if(j>zz[i])
dp[i][j]=inf;
else
{
dp[i][j]=dp[i+1][j]+t[i+1]*j;
//printf("%d %d %d\n",i,j,dp[i][j]);
for(int t1=1;t1<=z[i]&&t1<=j;t1++)
{
dp[i][j]=min(dp[i][j],d+dp[i+1][j-t1]+(j-t1)*t[i+1]);
// printf("%d %d %d\n",i,j,dp[i][j]);
}
}
//printf("%d %d %d\n",i,j,dp[i][j]);
}
}
dp[1][n]=dp[1][n]+n*t[1];
if(dp[1][n]>=inf)
printf("impossible\n");
else
printf("%d\n",dp[1][n]);
}
return 0;
}
144

被折叠的 条评论
为什么被折叠?



