题目描述
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
解题思路
打家劫舍是经典的动态规划的题目了,动态规划相对于递归更加高效,是利用从下往上的思想解决问题的,减少了大量的重复计算。 解决动态规划的思路就是写出动态方程,确定base case。 写出动态方程就是要分情况套路,这件事情是做还是不做。一般就是有两种选择,拿这道题目举例子,这个盗贼可以选择今天不偷,明天偷或者是今天偷,后天偷 最后还要用备忘录的思想来减少重叠子问题。
AC 代码
class Solution {
private int[] memo;
public int rob(int[] nums) {
memo=new int[nums.length];
Arrays.fill(memo,-1);
return dp(nums,0);
}
private int dp(int[] nums,int start){
//已经走过了所有的房子
if(start>=nums.length){
return 0;
}
//base case
if(memo[start]!=-1){
return memo[start];
}
//做选择
int res=Math.max(dp(nums,start+1),nums[start]+dp(nums,start+2));
//做备忘录
memo[start]=res;
return res;
}
}
总结
没啥总结的,花了两个小时,算是把题目弄懂了,好难呀!