其他分享
首页 > 其他分享> > Codeforces Round #628 (Div. 2)补题

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