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 }
posted @ 2012-11-05 12:04  silver__bullet  阅读(265)  评论(0编辑  收藏  举报