您的位置:首页 > 其它

Codeforces 698A. Vacations (简单DP)

2016-07-20 10:48 471 查看
题目链接

题意

每天有四种状态

0-不能运动 不能写代码

1-可以运动 不能写代码

2-不能运动 可以写代码

3-可以运动 可以写代码

不能连续两天运动或连续两天写代码。

问最少的休息天数

思路

dp[i][k] 代表第i天干第k种事的最小休息天数,如果当天不能干该种事情,则置为inf,剩下的转移方程为

dp[i+1][0]=min(min(dp[i][0],dp[i][1]),dp[i][2])+1;dp[i+1][1]=min(dp[i][0],dp[i][2]);dp[i+1][2]=min(dp[i][0],dp[i][1]);

最后的答案就是min(dp[n][0],dp[n][1],dp[n][2])

代码

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e2+10;
const int inf = 1e9+7;
int dp[maxn][4];
int day[maxn];
int main(){
int n;
cin >>n;
for(int i = 0 ; i < n ; i ++){
scanf("%d",day +i);
}

for(int i = 0 ; i < n ; i ++){
if(day[i] == 0){
dp[i+1][0] = min(min(dp[i][0],dp[i][1]),dp[i][2
9aa0
])+1;
dp[i+1][1] = inf;
dp[i+1][2] = inf;
}
if(day[i] == 1){
dp[i+1][0] = min(min(dp[i][0],dp[i][1]),dp[i][2])+1;
dp[i+1][1] = inf;
dp[i+1][2] = min(dp[i][0],dp[i][1]);
}
if(day[i] == 2){
dp[i+1][0] = min(min(dp[i][0],dp[i][1]),dp[i][2])+1;
dp[i+1][1] = min(dp[i][0],dp[i][2]);
dp[i+1][2] = inf;
}
if(day[i] == 3){
dp[i+1][0] = min(min(dp[i][0],dp[i][1]),dp[i][2])+1;
dp[i+1][1] = min(dp[i][0],dp[i][2]);
dp[i+1][2] = min(dp[i][0],dp[i][1]);
}
}
printf("%d",min(min(dp
[0],dp
[1]),dp
[2]));
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: