题意
- 你是一个专业的强盗,计划在街上抢劫房屋。每个房子都有一定数量的钱存在,阻止你抢劫他们的唯一限制是相邻的房屋有连接的安全系统,如果两个相邻的房子在同一个晚上被打破,它将自动联系警察。
- 给出一个代表每个房子的金额的非负整数列表,确定今晚可以抢劫的最大金额而不警告警察。
- 例1:
- 输入: [1,2,3,1]
- 输出: 4
- 说明: Rob house 1(money = 1)然后抢房子3(钱= 3)。
-
您可以抢夺的总金额= 1 + 3 = 4。
第一种解法暴力求解法
还是那个问题当前的数你是要还是不要取决于是否加上当前的数和不加当前的数哪个更大
public int rob(int[] nums) {
return getRod(nums,0,0);
}
/**
* 暴力求解
* @param nums
* @param index
* @param res
* @return
*/
private int getRod(int[] nums, int index, int res) {
if (index>=nums.length) return res;
int sum=0;
int rod = getRod(nums, index + 2, res + nums[index]);
int rodmin = getRod(nums, index + 1, res);
sum=Math.max(rod,rodmin);
res=Math.max(res,sum);
return res;
}
第二种解法DP
public int getRob(int[] nums){
if (nums.length==0 || nums==null) return 0;
if (nums.length==1) return nums[0];
if (nums.length==2) return Math.max(nums[0],nums[1]);
int n = nums.length;
int[] dp=new int[n];
dp[0]=nums[0];
dp[1]=Math.max(nums[0],nums[1]);
for (int i = 2; i < n; i++) {
dp[i] = Math.max(dp[i-1], (dp[i-2]+nums[i]));
}
return dp[n-1];
}