動態規劃專題之----198. House Robber

飄過的小熊發表於2017-04-13

標籤(空格分隔): LeetCode


題目連結

動態規劃的easy題,可是我還是做了很久,。然而,還是做出來了。
題目的大致意思是給定一個陣列,求出不相鄰的數之和的最大值。

2 1 1 2 —–》4

1.分解子問題

就拿這個2 1 1 2來說,我們可以先求出2 1 1的最值,然後加上2後再來判斷是加2好還是不加2好。其中不加2不是因為加了2結果變小,而是因為我們選擇了2 1 1的最後一個1,此時加上2後就不滿足不相鄰的條件了。於是遞推我們可以先計算2 1後再來判斷加1的情況。

2.確定狀態

dp[i]==j

dp[i]==j
表示前i+1個數的最值為j

3.確定初始狀態

dp[0]=nums[0];

dp[0]=nums[0];

dp[1]=Math.max(nums[0],nums[1])
dp[1]=Math.max(nums[0],nums[1])

4.確定遞推公式

dp[i]=Math.max(dp[i2]+nums[i],dp[i1])

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

5.編碼


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

    public static void main(String[] args) {
        Solution s = new Solution();
        int[] nums = {2, 1, 1, 2};
        System.out.println(s.rob(nums));
    }
}

相關文章