原题链接在这里: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.