题目描述
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。
题目分析
动态规划
设前 i 个的最高偷窃金额为 ans[i],则对于每个房间都有
– 选择当前房间, ans[i] = ans[i – 2] + nums[i]
– 不选择当前房间,ans[i] = ans[i – 1]
在这两个值中间取最大值即可。
Java
public int rob(int[] nums) {
int[] ans = new int[nums.length];
ans[0] = nums[0];
if (nums.length > 1) {
ans[1] = Math.max(nums[0], nums[1]);
}
for (int i = 2; i < nums.length; i++) {
ans[i] = Math.max(ans[i - 1], ans[i - 2] + nums[i]);
}
return ans[nums.length - 1];
}
Kotlin
fun rob(nums: IntArray): Int {
val ans = IntArray(nums.size)
ans[0] = nums[0]
if (nums.size > 1) {
ans[1] = max(nums[0], nums[1])
}
for (i in 2 until nums.size) {
ans[i] = max(ans[i - 1], ans[i - 2] + nums[i])
}
return ans.last()
}