力扣198.打家劫舍*
引言
在做动态规划专题的过程中发现打家劫舍是一个十分经典的动态规划类型题,之后的好多题都有这道题的影子,比如我下一篇准备整理的740.删除并获得点数,弄明白打家劫舍真的可以算是动态规划入门了(所以这个动态规划门槛也太高了吧,我的脑子,我的脑子啊)
题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
解题思路
动态规划
1.定义子问题:从k个房子中能偷到的最大金额,当k==n时就是原问题
2.写出子问题的递推关系:前k个房子的偷法,是偷前k-1个房子或者偷k-2和当前房子,取两种情况下的最大值
3.确定DP数组计算顺序:偷到第k个房子的最大金额取决于k-1和k-2,计算顺序从左到右
代码
class Solution {
public int rob(int[] nums) {
if(nums.length==0){
return 0;
}
int length=nums.length;
int[] dp=new int[length+1];
//dp[i]代表偷第i个房子,比nums数组下标多一个
dp[0]=0;
dp[1]=nums[0];
for(int i=2;i<=length;i++){
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i-1]);
}
return dp[length];
}
}