徘徊再对错边缘啊 这个也错了一次
状态很明显就是二维的 过去了几辆车 处理完了几个人 然后每次for循环更新即可
注意要分段啊
每段的人和每段的上车人数要分清楚
还有另外一种就是从全局进行考虑 然后把所有上车的人的时间计算进去
这样的也比较简单 可以少记录分段的时间差
首先是分段处理的方法:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define inf 999999999
int main(){
int dp[111][111];
int n,k,d,s,ti,zi;
int t;scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&n,&k,&d,&s);
for(int i=0;i<111;++i)
for(int j=0;j<111;++j)
dp[i][j]=inf;
dp[0][0]=0;
int past=0;
for(int i=1;i<=k;++i){
scanf("%d%d",&ti,&zi);
for(int j=0;j<=n;++j)
if(dp[i-1][j]!=inf){
for(int z=0;z<=zi;++z){
if(j+z<=n){
dp[i][j+z]=min(dp[i][j+z],dp[i-1][j]+(ti-past)*(n-j)+(z==0?0:d));
// printf("%d %d %d %d\n",i,j+z,z,dp[i][j+z]);
}
}
}
past=ti;
}
if(dp[k][n]==inf)printf("impossible\n");
else printf("%d\n",dp[k][n]);
}
return 0;
}
然后是总体考虑的方法:
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
#define inf 999999999
int main(){
int dp[111][111];
int n,k,d,s,ti,zi;
int t;scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&n,&k,&d,&s);
for(int i=0;i<111;++i)
for(int j=0;j<111;++j)
dp[i][j]=inf;
dp[0][0]=0;
for(int i=1;i<=k;++i){
scanf("%d%d",&ti,&zi);
for(int j=0;j<=n;++j)
if(dp[i-1][j]!=inf){
for(int z=0;z<=zi;++z){
if(j+z<=n){
dp[i][j+z]=min(dp[i][j+z],dp[i-1][j]+ti*z+(z==0?0:d));
// printf("%d %d %d %d\n",i,j+z,z,dp[i][j+z]);
}
}
}
}
if(dp[k][n]==inf)printf("impossible\n");
else printf("%d\n",dp[k][n]);
}
return 0;
}