相关标签
一、题目要求
二、题解和代码实现
1.题解
代码如下(示例):
2.读入数据
代码如下(示例):
class Solution {
public int rob(int[] nums) {
if (nums.length==0){
return 0;
}
if (nums.length <=2){
return Math.max(nums[0],nums[nums.length-1]);
}
//这是截取数组从0到numlength-1的数组,也就是不偷最后一间房的数组
int[] oneNums = Arrays.copyOfRange(nums, 0, nums.length - 1);
//这是截取数组从1到numlength的数组,也就是偷最后一间房的数组,不偷第一间房的数组
int[] Nums = Arrays.copyOfRange(nums, 1, nums.length);
int oneCount = rob1(oneNums);//获取偷第一间房可以得到的最大钱数
int count = rob1(Nums);//获取偷最后一间房,而不偷第一间房可以得到的最大钱数
return Math.max(oneCount,count);//返回两者中的较大的数
}
//也是打家劫舍的实现代码
public int rob1(int[] nums) {
int[] dp = new int[nums.length+1];
dp[0] = 0;//dp[0] = 0 ,因为当没有房屋给你偷得时候 你就没有钱
dp[1] = nums[0];//dp[1] = nums[0] 只有一间房屋时,就只能偷盗这一间房屋
//小部分推出全局
for (int i = 2; i < dp.length; i++) {
//dp[2] = nums[1] + dp[0] 与 dp[1] 进行比较取得最大值
//动态方程,打家劫舍固定方程
dp[i] = Math.max(dp[i-1],dp[i-2]+nums[i-1]);
}
return dp[nums.length];//返回n 间房偷到的最大钱数
}
}