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

题目链接

那场1个题就晋级的初赛,我当时搞A题,弄了一个多小时。。。这个DP,在各种瞎搞,修改之后,过了。。。

 1 #include <cstdio>

 2 #include <cstring>

 3 #include <queue>

 4 #include <map>

 5 #include <iostream>

 6 using namespace std;

 7 #define INF 100000000

 8 int dp[201][201];

 9 int t[101],z[101];

10 int main()

11 {

12 

13     int N,K,D,S,i,j,k,u,ans,cas;

14 

15     scanf("%d",&cas);

16     while(cas--)

17     {

18         scanf("%d%d%d%d",&N,&K,&D,&S);

19         for(i = 1;i <= K;i ++)

20         scanf("%d%d",&t[i],&z[i]);

21         for(i = 1;i <= K;i ++)

22         {

23             for(j = 1;j <= N;j ++)

24             dp[i][j] = INF;

25         }

26         for(i = 1;i <= z[1];i ++)

27         {

28             dp[1][i] = D + t[1]*i;

29         }

30         for(i = 2;i <= K;i ++)

31         {

32             for(j = 1;j <= N;j ++)

33             {

34                 dp[i][j] = min(dp[i-1][j],dp[i][j]);

35                 for(k = 1;k < i;k ++)

36                 {

37                     for(u = 1;u <= z[i];u ++)

38                     {

39                         if(t[i] >= t[k]&&j >= u)

40                         dp[i][j] = min(dp[k][j-u] + D + t[i]*u,dp[i][j]);

41                     }

42                 }

43             }

44         }

45         ans = INF;

46         for(i = 1;i <= K;i ++)

47         ans = min(ans,dp[K][N]);

48         if(ans == INF)

49         printf("impossible\n");

50         else

51         printf("%d\n",ans);

52     }

53     return 0;

54 }

 

你可能感兴趣的:(HDU)