1. 程式人生 > >LeetCode-198. House Robber (JAVA)尋找陣列不相鄰組合最大值DP

LeetCode-198. House Robber (JAVA)尋找陣列不相鄰組合最大值DP

198. 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.

這道題的本質相當於在一列陣列中取出一個或多個不相鄰數,使其和最大。

這題的考點是動態規劃
動態規劃一定要找遞推公式!!!

1. 對這題來說,對每一家房子,在其前一家房子偷不偷的前提下,有兩種可能的情況。
2. 前一家房子被偷了,它就不能再偷了。前一家房子沒被偷,它可以被偷也可以選擇不偷。
3. 可看出,每一個子問題都依賴於前一個子問題,同時每一個子問題都會產生至少一種情況(之多兩種情況)狀態轉移方程:

dp[0] = num[0] (當i=0時)
dp[1] = max(num[0], num[1]) (當i=1時)
dp[i] = max(num[i] + dp[i - 2], dp[i - 1])   (當i !=0 and i != 1時)
	public int rob(int[] nums) {
		if (nums == null)
			return 0;
		int n = nums.length;
		if (n == 0)
			return 0;
		if (n == 1)
			return nums[0];
		int dp[] = new int[n];
		dp[0] = nums[0];
		dp[1] = Math.max(nums[0], nums[1]);
		for (int i = 2; i < n; i++)
			dp[i] = Math.max(dp[i - 2]
					+ nums[i], dp[i - 1]);
		return dp[n - 1];
	}

空間優化

用本身陣列代替dp陣列。

	public int rob(int[] nums) {
		if (nums == null)
			return 0;
		int n = nums.length;
		if (n == 0)
			return 0;
		if (n == 1)
			return nums[0];
		nums[1] = Math.max(nums[0], nums[1]);
		for (int i = 2; i < n; i++)
			nums[i] = Math.max(nums[i - 2] 
					+ nums[i], nums[i - 1]);
		return nums[n - 1];
	}