0
点赞
收藏
分享

微信扫一扫

动态规划学习

玉字璧 2022-03-25 阅读 41
动态规划

一、每天四种情况:0、不可健身,不可比赛;1、不可健身,可比赛;2、可健身,不可比赛;3、可健身,可比赛。不能连续两天比赛或健身,可以选择比赛健身或休息,求n天最少休息天数

1<=n<=100

不能因为数据原因,去影响对状态的判断 

int dp[maxn][3];
void solve()
{
	int n;
	cin >> n;
	memset(dp, 0x3f, sizeof(dp));
	dp[0][0] = dp[0][1] = dp[0][2] = 0;
	for (int i = 1; i <= n; i++)
	{
		int temp;
		cin >> temp;
		dp[i][0] = min(dp[i - 1][0], min(dp[i - 1][1], dp[i - 1][2])) + 1;	
		//假设今天休息,代表1~i天最少的休息天数
		if (temp == 1||temp==3)
		{
			dp[i][2] = min(dp[i - 1][0], dp[i - 1][1]);		
			//今天可比赛,取昨天休息(因为昨天可能比赛)或者健身的最小值
		}
		if (temp == 2 || temp == 3)
		{
			dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]);		
			//今天可健身,取昨天休息(因为昨天可能健身)或者比赛的最小值
		}
	}
	cout << min(dp[n][0], min(dp[n][1], dp[n][2])) << '\n';
}

举报

相关推荐

0 条评论