题目链接:http://codeforces.com/problemset/problem/698/A
题意:
有 $n$ 天假期,每天有四种情况:0、体育馆不开门,没有比赛;1、体育馆不开门,有比赛;2、体育馆开门,没有比赛;3、体育馆开门,有比赛。
每天都可以选择一件事做:休息、去体育馆运动、打比赛。
现在有一个限制条件:不能连续两天都去体育馆,或者连续两天都打比赛。要求尽量使得休息的天数最少,求出这个天数。
题解:
$f[i][0,1,2]$ 表示前 $i$ 天,第 $i$ 天休息/运动/比赛的情况下,最少的休息天数。
AC代码:
#include<bits/stdc++.h> #define Min(x,y,z) min(x,min(y,z)) using namespace std; const int maxn=105; int n,a[maxn]; int f[maxn][3]; //0休息 1体育馆 2比赛 int main() { cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; memset(f,0x3f,sizeof(f)); f[0][0]=f[0][1]=f[0][2]=0; for(int i=1;i<=n;i++) { f[i][0]=Min(f[i-1][0],f[i-1][1],f[i-1][2])+1; if(a[i]==1 || a[i]==3) //有比赛 f[i][2]=min(f[i-1][0],f[i-1][1]); if(a[i]==2 || a[i]==3) //体育馆开门 f[i][1]=min(f[i-1][0],f[i-1][2]); } cout<<Min(f[n][0],f[n][1],f[n][2])<<endl; }