题意理解:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。
这道题目的含义可理解为: 有一组元素nums=[1,2,3,1]
约束条件时不取相邻的元素,求能获得的最大值
当前状态总是由之前的选择来决定,所以可以考虑动态规划来解决问题。
解题思路:
假设dp[i]表示有i个元素时,所能获取的最大值。
则i=0时,有dp[0]=nums[0]=1
i=1时, 有dp[1]=max(nums[0],nums[1])=max(1,2)=2,即两间屋子选一个价值最高的
i=2时, 没有偷i前一个,当前这个可以偷 dp[i-2]+nums[i]
偷了前一个,则当前这个不能偷 dp[i-1]
则有:
dp[i]=max(dp[i-2]+nums[i],dp[i-1]) i>=2------递推公式
所以该问题是一个动态规划问题
额外注意:dp[i]表示考虑i个屋子能偷到的最大值,不一定偷第i个屋子。
1.解决
java
public int rob(int[] nums) {
if(nums.length==0) return 0;
int[] dp=new int[nums.length];
Arrays.fill(dp,0);
dp[0]=nums[0];
dp[1]=Math.max(nums[0],nums[1]);
for(int i=2;i<nums.length;i++){
dp[i]=Math.max(dp[i-1],dp[i-2]+nums[i]);
}
return dp[nums.length-1];
}
2.分析
时间复杂度:O(n)
空间复杂度:O(n)