题意:一个人每天按照情况可以选择做事或者休息,但是他连续两天不做同一件事,这天能不能做某件事是受条件限制的,求休息的最短天数
题解:
dp,对于每一天的条件下的休息时间的变化是根据以前的来增长的。dp[105][3],列数用来表示每一天,行数0,1,2表示这天在0,1,2这三种情况对这一天的影响。
如果这一天是1,那么你只能选择做1或者休息,那么
dp[i][1] = min(dp[i-1][0],dp[i-1][2]);
而对于今天是0的dp[i][0]来说,没有影响,依旧是
dp[i][0] = 1 + min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]));
不存在做2 的情况,所以dp[i][2]是一种无穷大的情况。
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <set>
#include <map>
#include <string>
#include <cmath>
#include <cstdlib>
#include <ctime>
#include <stack>
using namespace std;
typedef pair<int, int> pii;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<int> vi;
#define pr(x) cout << #x << ": " << x << " "
#define pl(x) cout << #x << ": " << x << endl;
#define pri(a) printf("%d\n",(a))
#define xx first
#define yy second
#define sa(n) scanf("%d", &(n))
#define sal(n) scanf("%lld", &(n))
#define sai(n) scanf("%I64d", &(n))
#define vep(c) for(decltype((c).begin() ) it = (c).begin(); it != (c).end(); it++)
const int INF = 0x3f3f3f3f;
int dp[105][3];
int main(){
int n;
cin>>n;
memset(dp,0x3f,sizeof(dp));
int op;
dp[0][0] = 0;
for(int i = 1;i<=n;i++){
cin>>op;
if(op == 0){
dp[i][0] = 1 + min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]));
}
if(op == 1){
dp[i][1] = min(dp[i-1][0],dp[i-1][2]);
dp[i][0] = 1 + min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]));
}
if(op == 2){
dp[i][2] = min(dp[i-1][0],dp[i-1][1]);
dp[i][0] = 1 + min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]));
}
if(op == 3){
dp[i][0] = 1 + min(dp[i-1][0],min(dp[i-1][1],dp[i-1][2]));
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;
ans = min(dp[n][0],min(dp[n][1],dp[n][2]));
cout<<ans<<endl;
}