Codeforces Round #628 (Div. 2)补题
作者:互联网
C.Vacations
思路: 记dp[i][0] 表示第i天所能进行的活动(休息,体育活动,打比赛)
dp[i][0] = 0 是只能休息,= 1 是只能进行体育活动, = 2 是只能打比赛,= 3 是即可以进行体育活动和打比赛(当然也可以休息,但它显然不能休息)。
dp[i][1] 代表到前i天休息的最少天数。
转移方程得分类讨论,感觉说不大清, 直接贴代码吧,已添加注释…
#include <bits/stdc++.h>
#define IOS ios::sync_with_stdio(false)
#define pf printf
#define pq priority_queue
#define sc(x) scanf("%d", &x)
#define scl(x) scanf("%lld", &x)
#define rep(i, s, e) for(int i = s;i <= e; ++ i)
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> PII;
const int N = 210;
int n, a[N], dp[N][3]; // dp[i][0] 0 闲 ,1体育 , 2 比赛 , 3两者都可, [1]是休息天数
int main()
{
cin >> n;
for(int i = 1;i <= n; ++ i) {
cin >> a[i];
}
for(int i = 1;i <= n; ++ i) {
dp[i][1] = dp[i-1][1]; // 休息的最少天数和之前相等
if(a[i] == 0) dp[i][1] ++; // 如果这天只能休息,休息天数增加,这天的状态dp[i][0] = 0, 省略了
else if(a[i] == 1) {
if(dp[i-1][0] == 1) dp[i][0] = 0, dp[i][1] ++; //如果之前也是1, 冲突了,休息天数增加
else dp[i][0] = 1;
}
else if(a[i] == 2) {
if(dp[i-1][0] == 2) dp[i][1] ++;
else dp[i][0] = 2;
} else { // 体育和比赛都可的情况
if(dp[i-1][0] == 1) dp[i][0] = 2;
else if(dp[i-1][0] == 2) dp[i][0] = 1;
else dp[i][0] = 3;
}
}
cout << dp[n][1] << "\n";
}
标签:int,天数,628,else,补题,休息,Div,dp,define 来源: https://blog.csdn.net/m0_46473861/article/details/113921245