codeforces 698A
题意:
给
定
n
天
,
每
天
你
可
以
健
身
、
比
赛
或
休
息
,
允
许
连
续
两
天
休
息
,
但
不
允
许
连
续
两
天
健
身
或
比
赛
。
给定n天,每天你可以健身、比赛或休息,允许连续两天休息,但不允许连续两天健身或比赛。
给定n天,每天你可以健身、比赛或休息,允许连续两天休息,但不允许连续两天健身或比赛。
每
天
给
定
a
(
取
值
0
—
3
)
,
代
表
健
身
房
是
否
开
门
以
及
比
赛
是
否
进
行
。
每天给定a(取值0—3),代表健身房是否开门以及比赛是否进行。
每天给定a(取值0—3),代表健身房是否开门以及比赛是否进行。
问
n
天
最
少
休
息
几
天
。
问n天最少休息几天。
问n天最少休息几天。
题解:
d p [ i ] [ j ] 表 示 到 第 i 天 为 止 , 并 且 前 一 天 进 行 事 件 j 的 最 少 休 息 天 数 。 dp[i][j]表示到第i天为止,并且前一天进行事件j的最少休息天数。 dp[i][j]表示到第i天为止,并且前一天进行事件j的最少休息天数。
- a = 0 , 即 健 身 房 不 开 且 比 赛 不 进 行 , d p [ i ] [ 0 ] = m i n ( m i n ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] ) , d p [ i − 1 ] [ 2 ] ) + 1 a=0,即健身房不开且比赛不进行,dp[i][0] = min(min(dp[i-1][0], dp[i-1][1]), dp[i-1][2])+1 a=0,即健身房不开且比赛不进行,dp[i][0]=min(min(dp[i−1][0],dp[i−1][1]),dp[i−1][2])+1
- a = 1 , 即 健 身 房 不 开 但 比 赛 进 行 , d p [ i ] [ 1 ] = m i n ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 2 ] ) a=1,即健身房不开但比赛进行,dp[i][1] = min(dp[i-1][0], dp[i-1][2]) a=1,即健身房不开但比赛进行,dp[i][1]=min(dp[i−1][0],dp[i−1][2])
- a = 2 , 即 健 身 房 开 但 比 赛 不 进 行 , d p [ i ] [ 2 ] = m i n ( d p [ i − 1 ] [ 0 ] , d p [ i − 1 ] [ 1 ] ) a=2,即健身房开但比赛不进行,dp[i][2] = min(dp[i-1][0], dp[i-1][1]) a=2,即健身房开但比赛不进行,dp[i][2]=min(dp[i−1][0],dp[i−1][1])
- a = 3 , 即 健 身 房 开 且 比 赛 进 行 , 同 a = 1 和 a = 2 a=3,即健身房开且比赛进行,同a=1和a=2 a=3,即健身房开且比赛进行,同a=1和a=2
#include <bits\stdc++.h>
using namespace std;
const int N = 101;
int dp[N][3];
int main() {
int n, a;
cin >> n;
memset(dp, 0x3f, sizeof(dp));
dp[0][0] = 0;
for(int i = 1 ; i <= n ; i++){
cin >> a;
dp[i][0] = min(min(dp[i-1][0], dp[i-1][1]), dp[i-1][2])+1;
switch (a) {
case 1:
dp[i][1] = min(dp[i-1][0], dp[i-1][2]);
break;
case 2:
dp[i][2] = min(dp[i-1][0], dp[i-1][1]);
break;
case 3:
dp[i][1] = min(dp[i-1][0], dp[i-1][2]);
dp[i][2] = min(dp[i-1][0], dp[i-1][1]);
break;
}
}
cout << min(min(dp[n][0], dp[n][1]), dp[n][2]) << endl;
return 0;
}