你是一個專業的小偷,計划偷竊沿街的房屋,每間房內都藏有一定的現金。這個地方所有的房屋都圍成一圈,這意味着第一個房屋和最后一個房屋是緊挨着的。同時,相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。
給定一個代表每個房屋存放金額的非負整數數組,計算你在不觸動警報裝置的情況下,能夠偷竊到的最高金額。
示例 1:
輸入: [2,3,2]
輸出: 3
解釋: 你不能先偷竊 1 號房屋(金額 = 2),然后偷竊 3 號房屋(金額 = 2), 因為他們是相鄰的。
示例 2:
輸入: [1,2,3,1]
輸出: 4
解釋: 你可以先偷竊 1 號房屋(金額 = 1),然后偷竊 3 號房屋(金額 = 3)。
偷竊到的最高金額 = 1 + 3 = 4 。
1.先考慮一個問題,就是原條件中第一個與最后一個可以同時取.這個問題就是leetcode---打家劫舍1
記解決這個問題函數為 solve(int[] nums)
狀態轉移方程:
dp[i]=max(dp[i-2],dp[i-3])
2.增加了第一個和最后一個不能同時取的限制后,可以發現,
這時的最大值要么在solve(nums[0:nums.length-1])
或者在solve(nums[1:nums.length])
即把原問題划分為2個solve()問題
var rob = function(nums) {
const n = nums.length;
if (n < 2) return n? nums[0]: 0;
return Math.max(robber(nums, 0, n-2), robber(nums, 1, n-1));
};
function robber(nums, start, end) {
let pre = 0, cur = 0;
for (let i=start;i<=end;i++) {
let temp = Math.max(pre+nums[i], cur);
pre = cur;
cur = temp;
}
return cur;
}