TYVJ1195

又是水DP
设dp[i][0] 用勺子吃完第i个菜需要的最小时间
dp[i][1] 用筷子吃完第i个菜需要的最大时间
DP目标min(dp[n][0],dp[n][1])

状态转移:

dp[i][0] = min(dp[i-1][0]+a,dp[i-1][1]+a+c);
dp[i][1] = min(dp[i-1][0]+b+c,dp[i-1][1]+a);

初始条件:
dp[1][0] = a+c;
dp[1][1] = b;

这题可以作为初学者理解DP的很好的例题

 

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 const int maxn = 105;
 7 
 8 int dp[maxn][2];
 9 
10 int main()
11 {
12     //freopen("in.txt","r",stdin);
13     int n,a,b,c;
14     cin>>n;
15     cin>>a>>b>>c;
16     dp[1][0] = a+c;
17     dp[1][1] = b;
18     for(int i = 2;i<=n;++i)
19     {
20 
21         cin>>a>>b>>c;
22         dp[i][0] = min(dp[i-1][0]+a,dp[i-1][1]+a+c);
23         dp[i][1] = min(dp[i-1][0]+b+c,dp[i-1][1]+b);
24     }
25     printf("%d\n",min(dp[n][1],dp[n][0]));
26     return 0;
27 }

 

posted on 2014-08-24 23:05  round_0  阅读(139)  评论(0编辑  收藏  举报

导航