Uva 10201 Adventures in Moving - Part IV
题意:一辆车从起点走到终点,途中有些加油站,给出每个加油站距离和油价,最后求从起点到终点最小费用,其中在起点有100升油,要求到终点至少也还有100升油。
解法:dp[i][j]记录走到第i站升j升油的最小费用,用当前的合法状态去更新后一个状态。
需要注意的是最后一站不一定在终点,注意读入方式。。。。
1 #include<iostream> 2 #include<cstring> 3 #include<algorithm> 4 #include<cstdio> 5 #define N 110 6 #define M 210 7 using namespace std; 8 typedef long long ll; 9 const int inf=(1<<30); 10 int dis[N],cost[N]; 11 int dp[N][M]; 12 int main(){ 13 // freopen("out.out","w",stdout); 14 int t; 15 scanf("%d",&t); 16 while(t--){ 17 int d; 18 scanf("%d",&d); 19 getchar(); 20 int cnt=0,a,b; 21 bool flag=0; 22 dis[cnt]=0; 23 char s[N]; 24 while(gets(s)&&s[0]!=0){ 25 ++cnt; 26 sscanf(s,"%d%d",&dis[cnt],&cost[cnt]); 27 if(dis[cnt]>d||dis[cnt]<0)--cnt; 28 } 29 for(int i=0;i<N;i++) 30 for(int j=0;j<=200;j++) 31 dp[i][j]=inf; 32 dp[0][100]=0; 33 for(int i=0;i<=cnt;i++){ 34 for(int j=0;j<=200;j++){ 35 if(dp[i][j]<inf){ 36 if(i+1<=cnt&&(j-(dis[i+1]-dis[i])>=0)) 37 dp[i+1][j-(dis[i+1]-dis[i])]=min(dp[i+1][j-(dis[i+1]-dis[i])],dp[i][j]); 38 if(i>0) 39 for(int k=0;j+k<=200;k++){ 40 dp[i][j+k]=min(dp[i][j+k],dp[i][j]+k*cost[i]); 41 } 42 } 43 } 44 } 45 int ans=inf; 46 for(int i=100;i<=200;i++) 47 if(i>=100+d-dis[cnt])ans=min(ans,dp[cnt][i]); 48 if(ans<inf) 49 printf("%d\n",ans); 50 else 51 puts("Impossible"); 52 if(t>0)puts(""); 53 } 54 return 0; 55 }