CodeForces 698A

要么去体育馆,要么去比赛,要么闲在家里

给出每一天体育馆和比赛的有无情况,要求连续两天不能去同一个地方

问最少闲几天

DP方程很容易看出

  dp(第i天能去的地方) = min(dp(第i-1天的三种情况)) ;

  dp(第i天呆在家里) = min(dp(第i-1天的三种情况))+1;

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 #define inf 0x3f3f3f3f
 5 int a[105],ans[105][3],n;
 6 void dfs()
 7 {
 8     ans[0][0]=ans[0][1]=ans[0][2]=0;
 9     for(int i=1;i<=n;i++)
10     {
11         if(a[i]==0)
12         {
13             ans[i][1]=inf;
14             ans[i][2]=inf;
15         }
16         else if(a[i]==1)
17         {
18             ans[i][1]=inf;
19             ans[i][2]=min(ans[i-1][0],ans[i-1][1]);            
20         }
21         else if(a[i]==2)
22         {
23             ans[i][2]=inf;
24             ans[i][0]++;
25             ans[i][1]=min(ans[i-1][0],ans[i-1][2]);                
26         }
27         else
28         {
29             ans[i][2]=min(ans[i-1][0],ans[i-1][1]);
30             ans[i][1]=min(ans[i-1][0],ans[i-1][2]);        
31         }
32         ans[i][0]=min(ans[i-1][0],ans[i-1][1]);
33         ans[i][0]=min(ans[i][0],ans[i-1][2]);
34         ans[i][0]++;
35     }
36 }
37 int main()
38 {
39     scanf("%d",&n);
40     for(int i=1;i<=n;i++)
41     {
42         scanf("%d",&a[i]); 
43     }
44     dfs();
45     int res=min(ans[n][0],ans[n][1]);
46     res=min(res,ans[n][2]);
47     printf("%d
",res);
48 }
我自倾杯,君且随意
原文地址:https://www.cnblogs.com/nicetomeetu/p/5701564.html