# Code Forces 698A Vacations

## 题目描述

Vasya has n

1. on this day the gym is closed and the contest is not carried out;
2. on this day the gym is closed and the contest is carried out;
3. on this day the gym is open and the contest is not carried out;
4. on this day the gym is open and the contest is carried out.

On each of days Vasya can either have a rest or write the contest (if it is carried out on this day), or do sport (if the gym is open on this day).

Find the minimum number of days on which Vasya will have a rest (it means, he will not do sport and write the contest at the same time). The only limitation that Vasya has — he does not want to do the same activity on two consecutive days: it means, he will not do sport on two consecutive days, and write the contest on two consecutive days.

## It is an easy DP but has a long DP funcation.

0 means rest, 1 means contest and 2 means sport.

Then the DP funcation come up quickly (i-1 means the last day):

if(day[i]==0) dp[i]=min(dp[i-1],min(dp[i-1],dp[i-1]))+1;
if(day[i]==1) dp[i]=min(dp[i-1],min(dp[i-1],dp[i-1]))+1,dp[i]=min(dp[i-1],dp[i-1]);
if(day[i]==2) dp[i]=min(dp[i-1],min(dp[i-1],dp[i-1]))+1,dp[i]=min(dp[i-1],dp[i-1]);
if(day[i]==3) dp[i]=min(dp[i-1],min(dp[i-1],dp[i-1]))+1,dp[i]=min(dp[i-1],dp[i-1]),dp[i]=min(dp[i-1],dp[i-1]);

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#define REP(i,k,n)  for(int i=k;i<=n;i++)
using namespace std;
int x=0,f=1;
char ch=getchar();
for(;!isdigit(ch);ch=getchar())
if(ch=='-')
f=-1;
for(;isdigit(ch);ch=getchar())
x=x*10+ch-'0';
return x*f;
}
int n,m;
int day,dp;
int main(){
in(n);
memset(dp,127,sizeof(dp));
REP(i,1,n)  in(day[i]);
dp=dp=dp=0;
REP(i,1,n){
if(day[i]==0)  dp[i]=min(dp[i-1],min(dp[i-1],dp[i-1]))+1;
if(day[i]==1)  dp[i]=min(dp[i-1],min(dp[i-1],dp[i-1]))+1,dp[i]=min(dp[i-1],dp[i-1]);
if(day[i]==2)  dp[i]=min(dp[i-1],min(dp[i-1],dp[i-1]))+1,dp[i]=min(dp[i-1],dp[i-1]);
if(day[i]==3)  dp[i]=min(dp[i-1],min(dp[i-1],dp[i-1]))+1,dp[i]=min(dp[i-1],dp[i-1]),dp[i]=min(dp[i-1],dp[i-1]);
//cout<<dp[i]<<" "<<dp[i]<<" "<<dp[i]<<endl;
}
cout<<min(dp[n],min(dp[n],dp[n]));
return 0;
} 

posted @ 2019-01-25 20:05  Dijkstra·Liu  阅读(196)  评论(0编辑  收藏  举报