LeetCode 198. 打家劫舍
题目描述
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
思路
因为不能偷相邻的房间,假设当前这间必偷,其他的要么偷第n-2
间,要么偷第n-3
间
动态规划求解,dp数组含义为偷窃当前房屋能够获得的最高金额
初始化:dp数组初始化为0,dp[0]
初始化为nums[0]
,dp[1]
初始化为nums[1]
,dp[2]
的取值为Math.max(dp[0]+nums[2], dp[1])
动态求解:for循环从3开始,dp[i]=Math.max(dp[i-2]+nums[i], dp[i-3] + nums[i])
最高金额记录:定义变量max,if (max > dp[i]) max = dp[i]
代码
class Solution {public int rob(int[] nums) {if (nums == null || nums.length == 0){return 0;}else if (nums.length == 1){return nums[0];}else if (nums.length == 2){return Math.max(nums[0], nums[1]);}int[] dp = new int[nums.length];// 初始化dpdp[0] = nums[0];dp[1] = nums[1];dp[2] = Math.max(dp[1], dp[0] + nums[2]);if (nums.length == 3){return dp[2];}int cur_max = dp[2];// 正式对dp做操作for (int i = 3; i < dp.length; i++) {dp[i] = Math.max(dp[i - 2] + nums[i], dp[i - 3] + nums[i]);if (dp[i] > cur_max){cur_max = dp[i];}}return cur_max;}
}