LeetCode198 House Robber

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
             Total amount you can rob = 1 + 3 = 4.

Example 2:

Input: [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5 (money = 1).
             Total amount you can rob = 2 + 9 + 1 = 12.

题源:here;完整实现:here

思路:

这道简单题最后需要用动态规划来做,没想到。我们用一个向量来记录第i个房子的最大收益,则转移方程如下:

dp[i] = max(dp[i - 1], nums[i] + dp[i - 2]);

当然,这种动态规划问题多半可以使用中间变量来替代,所以一共有两种解法。

解法1:动态规划

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

解法2:中间变量

	int rob2(vector<int>& nums) {
		int n = nums.size();

		int a = 0, b = 0, c;
		for (int i = 1; i <= n; i++) {
			c = max(b, a + nums[i - 1]);
			a = b;
			b = c;
		}
		return b;
	}

猜你喜欢

转载自blog.csdn.net/m0_37518259/article/details/88534271
今日推荐