200 218 title (holidays (dp problem) Tencent)

Here Insert Picture Description
Here Insert Picture Description
Code is as follows: AC

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
#define INFINITY 65536
//dp[i][0],dp[i][1], dp[i][2] 分别记录第i天 休息/锻炼/工作时累计的最小休息天数.
int main() {
	int n;
	cin >> n;
	vector<int>gym(n);
	vector<int>company(n);
	for (int i = 0; i < n; i++)
		cin >> gym[i];
	for (int i = 0; i < n; i++)
		cin >> company[i];

	vector<vector<int>>dp(n + 1, vector<int>(3, INFINITY));//初始化
	dp[0][0] = dp[0][1] = dp[0][2] = 0;//初始化
	for (int i = 1; i < n + 1; i++)
	{
		if (company[i - 1] == 1 && gym[i - 1] == 1)//如果第i天公司开门,健身房也开门
		{
			dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;//第i天可以选择休息
			dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]);//第i天可以选择健身
			dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]);//第i天可以选择工作
		}
		else if (gym[i - 1] == 1)//如果第i天只有健身房开门
		{
			dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;
			dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]);
		}
		else if (company[i - 1] == 1)//如果第i天只有公司开门
		{
			dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;
			dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]);
		}
		else//如果第i天都不开门
		{
			dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;
		}
	}

	int res = min(dp[n][0], min(dp[n][1], dp[n][2]));
	cout << res << endl;
	system("pause");
	return 0;
}

Published 212 original articles · won praise 4 · Views 8868

Guess you like

Origin blog.csdn.net/ShenHang_/article/details/104311859