Codeforces 698A - Vacations - [简单DP]

题目链接: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;
}

猜你喜欢

转载自www.cnblogs.com/dilthey/p/10459772.html
今日推荐