【算法日志】动态规划刷题:不相邻选择类问题(day40)

算法随想录刷题60Day


目录

前言

打家劫舍1 (数组)

打家劫舍2(环形数组)

打家劫舍3(二叉树)


前言

今天主要讨论不相邻选择类问题,会在不同数据结构题型的下探讨该类问题的解法。


打家劫舍1 (数组)

【算法日志】动态规划刷题:不相邻选择类问题(day40)_第1张图片

本题只需要讨论当前数组的值取与不取之间的比较。

 	int rob(vector& nums)
	{
		int size = nums.size();
		vector dp(size + 1, 0);
		dp[1] = nums[0];
		for (int i = 2; i <= size; ++i)
		{
			dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1]);
		}
		return dp[size];
	}

打家劫舍2(环形数组)

【算法日志】动态规划刷题:不相邻选择类问题(day40)_第2张图片

相较于上题,本题需要额外考虑首位两个值取与不取的情况。

	int rob2(vector& nums) 
	{
		int size = nums.size();
		if (size == 1)return nums[0];
		int result;
		vector dp(size + 1, 0);
		dp[1] = nums[0];
		for (int i = 2; i < size; ++i)
			dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1]);
		result = dp[size - 1];
		dp[1] = 0;
		for (int i = 2; i <= size; ++i)
			dp[i] = max(dp[i - 1], dp[i - 2] + nums[i - 1]);
		return max(result, dp[size]);
	}

打家劫舍3(二叉树)

【算法日志】动态规划刷题:不相邻选择类问题(day40)_第3张图片

	vector traversal(TreeNode* root)
	{
		if (!root)return {0, 0};
		if (!root->left && !root->right)
			return vector {0, root->val};
		vector left = traversal(root->left);
		vector right = traversal(root->right);
		int val1 = max(left[0], left[1]) + max(right[0], right[1]);
		int val2 = root->val + left[0] + right[0];
		return {val1, val2};
	}
	int rob(TreeNode* root) 
	{
		vector result = traversal(root);
		return max(result[0], result[1]);
	}

你可能感兴趣的:(算法,动态规划,linux)