HDU4526威威猫系列故事——拼车记(DP)

http://acm.hdu.edu.cn/showproblem.php?pid=4526

额。。七夕快乐哦

刚推的时候有点乱 又各种小错误 查了好久。。

dp[i][k] = min(dp[i-1][g]+g*t+d,dp[i][k]){(g-k)<=res[i]} 第i辆车时 剩余K个人

 1 #include <iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 #include<stdlib.h>
 6 using namespace std;
 7 #define INF 0xfffffff
 8 int ca[111][2],dp[110][110];
 9 int main()
10 {
11     int t,g,i,j,k,n,s,d;
12     cin>>t;
13     while(t--)
14     {
15         cin>>n>>k>>d>>s;
16         memset(ca,0,sizeof(ca));
17         for(i = 1; i <= k ;i++)
18         scanf("%d%d",&ca[i][0],&ca[i][1]);
19         for(i = 1 ; i <= k ; i++)
20             for(j = 0 ; j <= n ;j++)
21             dp[i][j] = INF;
22         if(n==0)
23         {
24             printf("0\n");
25             continue;
26         }
27         if(ca[1][1]>=n)
28         {
29             cout<<d+ca[1][0]*n<<endl;
30             continue;
31         }
32         for(i = n-ca[1][1] ; i < n ; i++)
33         dp[1][i] = n*ca[1][0]+d;
34         dp[1][n] = n*ca[1][0];
35         for(i = 2; i <= k ;i++)
36         {
37             for(j = 0; j <= n ; j++)
38             {
39                 dp[i][j] = dp[i-1][j]+j*(ca[i][0]-ca[i-1][0]);
40                 for(g = j+1 ; g <= j+ca[i][1]&&g <= n  ;g++)
41                 dp[i][j] = min(dp[i][j],dp[i-1][g]+g*(ca[i][0]-ca[i-1][0])+d);
42             }
43         }
44         if(dp[k][0]==INF)
45         puts("impossible");
46         else
47         cout<<dp[k][0]<<endl;
48     }
49     return 0;
50 }
View Code

 

posted @ 2013-08-13 01:27  _雨  阅读(295)  评论(0编辑  收藏  举报