LeetCode House Robber

原题链接在这里:https://leetcode.com/problems/house-robber/

若没有房子,return 0; 若只有一个房子,return nums[0], 也就是这个房子里的钱; 若有两个房子,返回两个房子里钱较多的那个钱。

若是大于两个,因为不能偷邻家,所以新建一个array, 就是res,里面对应的 i 位存能偷到的最多钱的数目, 从前往后每一步都是最优的,就是比较res[i-2]+nums[i] 和 res[i-1].

res[i-2] + nums[i] 是 到i-2家能偷到的最大数加上i家的钱,res[i-1]就是偷到i-1家能偷到的最大钱数,因为若投了i-1家,就不能偷第i家了。


什么时候使用DP:

第一:最优化原理:如果问题的最优解所包含的子问题的解也是最优的,就称该问题具有最优子结构,即满足最优化原理。(这句话可理解为先将复杂的问题简单化,
达到最简后的解题公式同样可以解复杂情况。比如这里说给出多个房子,那我们就从没有房子和有1个、2个房子的情况入手,找到一个规律)
第二:无后效性:即某阶段状态一旦确定,就不受这个状态以后决策的影响。也就是说,某状态以后的过程不会影响以前的状态,只与当前状态有关。(也就是说每一个
子问题的解有一个状态,且固定不会变化,比如这道题中有3个房子,我选了第一个房子,这是一个状态,我选择第三个房子,这是第二个状态,但第二个状态不会改变第一个状态)


AC Java:

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

进阶题目是House Robber II.

你可能感兴趣的:(LeetCode,DP)