题目:cf363c
题意:给你n天的情况
0 代表休息
1 代表只能参加contest或休息
2 代表只能参加gym或休息
3 代表能参加contest或gym或休息
要求 不能连续参加contest 不能连续参加gym
问 如何安排使得休息日最少 输出休息日的数量
解答:d[i][j]表示第i天做什么。j=0:休息。j=1:gym。j=2:休息。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int n; const int INF = 1 << 30; const int MAXN = 110; int a[MAXN]; int dp[MAXN][5]; int main() { while(cin >> n) { for(int i = 1;i <= n;i++) cin >> a[i]; for(int i = 0;i <= n;i++) for(int j = 0;j < 3;j++) dp[i][j] = INF; for(int i = 0;i < 3;i++) dp[0][i] = 0; for(int i = 1;i <= n;i++) { int tmp = INF; for(int j = 0;j < 3;j++) if(dp[i-1][j] < tmp) tmp = dp[i-1][j]; dp[i][0] = tmp + 1; if(a[i] == 1){ dp[i][2] = min(dp[i-1][0],dp[i-1][1]); } else if(a[i] == 2){ dp[i][1] = min(dp[i-1][0],dp[i-1][2]); } else if(a[i] == 3){ dp[i][1] = min(dp[i-1][0],dp[i-1][2]); dp[i][2] = min(dp[i-1][0],dp[i-1][1]); } } int ans = INF; for(int i = 0;i < 3;i++) if(dp[n][i] < ans) ans = dp[n][i]; cout << ans << endl; } return 0; }