1,问题简述
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
2,示例
代码语言:javascript复制示例 1:
输入:[1,2,3,1]
输出:4
解释:偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。
偷窃到的最高金额 = 1 3 = 4 。
示例 2:
输入:[2,7,9,3,1]
输出:12
解释:偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。
偷窃到的最高金额 = 2 9 1 = 12 。
提示:
0 <= nums.length <= 100
0 <= nums[i] <= 400
3,题解思路
动态规划的使用,这里和按摩师的解法是一样的,具体内容看题解程序的解释说明吧
4,题解程序
代码语言:javascript复制
public class RobTest {
public static void main(String[] args) {
int[] nums = {1, 2, 3, 1};
int rob = rob(nums);
System.out.println("rob = " rob);
}
public static int rob(int[] nums) {
if (nums == null) {
return 0;
}
int n = nums.length;
//没有房屋的情况,则返回0
if (n == 0) {
return 0;
}
//只有一间房屋的情况,则返回nums[0]
if (n == 1) {
return nums[0];
}
//两间房屋的情况,则返回两间房屋中最大的(由于相邻房屋只能取一个)
if (n == 2) {
return Math.max(nums[0], nums[1]);
}
int[] dp = new int[n];
dp[0] = nums[0];
dp[1] = Math.max(nums[0], nums[1]);
//如果偷第n间房屋时,由于相邻房屋不能偷,此时状态方程为dp[n]=max(dp[n-2]) nums[n]
//如果不偷第n间房屋时,此时状态方程为dp[n]=max(dp[n-1]),等于到第 n - 1 个房屋的最大金额
for (int i = 2; i < n; i ) {
dp[i] = Math.max(dp[i - 1], dp[i - 2] nums[i]);
}
return dp[n - 1];
}
}
5,题解程序图片版
6,总结一下
本题基本上和按摩师那道题一样,不一样的是这道题自己加了比较稍微详细的注释说明,便于在看代码的时候,部分读者可以很清楚的知道这道题的解法,如果需要唠嗑的话,可以在下方进行留言评论。