你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有必定的现金,影响你偷窃的惟一制约因素就是相邻的房屋装有相互连通的防盗系统,若是两间相邻的房屋在同一夜被小偷闯入,系统会自动报警。数组
给定一个表明每一个房屋存放金额的非负整数数组,计算你在不触动警报装置的状况下,可以偷窃到的最高金额。ui
示例 1:this
输入: [1,2,3,1] 输出: 4 解释: 偷窃 1 号房屋 (金额 = 1) ,而后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。spa
示例 2:code
输入: [2,7,9,3,1] 输出: 12 解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 偷窃到的最高金额 = 2 + 9 + 1 = 12 。io
max(房屋4的钱+dp[2], dp[3])
;因此状态方程为:max(dp[n-2] + thisValue, dp[n-1])
, 代码为:function
var rob = function(nums) {
// 判断异常
if(!nums || nums.length === 0){
return 0;
}
// 边界条件
if(nums.length < 3){
return Math.max(...nums);
}
// 状态方程 dp(i) = max( dp(i-1) , dp(2) + arr[i])
let dp = [];
dp[0] = nums[0];
dp[1] = Math.max(nums[0],nums[1]);
for(let i = 2; i < nums.length; i++){
dp[i] = Math.max(dp[i-2] + nums[i], dp[i-1]);
}
return dp[dp.length-1];
};
复制代码
待续...class