codeforces 698A 线性DP

codeforces 698A


题意:

给 定 n 天 , 每 天 你 可 以 健 身 、 比 赛 或 休 息 , 允 许 连 续 两 天 休 息 , 但 不 允 许 连 续 两 天 健 身 或 比 赛 。 给定n天,每天你可以健身、比赛或休息,允许连续两天休息,但不允许连续两天健身或比赛。 n
每 天 给 定 a ( 取 值 0 — 3 ) , 代 表 健 身 房 是 否 开 门 以 及 比 赛 是 否 进 行 。 每天给定a(取值0—3),代表健身房是否开门以及比赛是否进行。 a03
问 n 天 最 少 休 息 几 天 。 问n天最少休息几天。 n


题解:

d p [ i ] [ j ] 表 示 到 第 i 天 为 止 , 并 且 前 一 天 进 行 事 件 j 的 最 少 休 息 天 数 。 dp[i][j]表示到第i天为止,并且前一天进行事件j的最少休息天数。 dp[i][j]ij

  • 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=0dp[i][0]=min(min(dp[i1][0],dp[i1][1]),dp[i1][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=1dp[i][1]=min(dp[i1][0],dp[i1][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=2dp[i][2]=min(dp[i1][0],dp[i1][1])
  • a = 3 , 即 健 身 房 开 且 比 赛 进 行 , 同 a = 1 和 a = 2 a=3,即健身房开且比赛进行,同a=1和a=2 a=3a=1a=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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值