Codeforces 698A - Vacations - [简单DP]

Posted dilthey

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}

 

以上是关于Codeforces 698A - Vacations - [简单DP]的主要内容,如果未能解决你的问题,请参考以下文章

Codeforces 698A - Vacations - [简单DP]

codeforces上怎么看测试数据

如何看codeforces做了多少题

codeforces上怎么看测试数据

codeforces比赛后怎么看题解和答案

codeforces是啥?