标签:
要么去体育馆,要么去比赛,要么闲在家里
给出每一天体育馆和比赛的有无情况,要求连续两天不能去同一个地方
问最少闲几天
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\n",res); 48 }
CodeForces 698A - Vacations (Codeforces Round #363 (Div. 2))
标签:
原文地址:http://www.cnblogs.com/nicetomeetu/p/5701564.html