一、每天四种情况:0、不可健身,不可比赛;1、不可健身,可比赛;2、可健身,不可比赛;3、可健身,可比赛。不能连续两天比赛或健身,可以选择比赛健身或休息,求n天最少休息天数
1<=n<=100
不能因为数据原因,去影响对状态的判断
int dp[maxn][3];
void solve()
{
int n;
cin >> n;
memset(dp, 0x3f, sizeof(dp));
dp[0][0] = dp[0][1] = dp[0][2] = 0;
for (int i = 1; i <= n; i++)
{
int temp;
cin >> temp;
dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;
//假设今天休息,代表1~i天最少的休息天数
if (temp == 1||temp==3)
{
dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]);
//今天可比赛,取昨天休息(因为昨天可能比赛)或者健身的最小值
}
if (temp == 2 || temp == 3)
{
dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]);
//今天可健身,取昨天休息(因为昨天可能健身)或者比赛的最小值
}
}
cout << min(dp[n][0], min(dp[n][1], dp[n][2])) << '\n';
}