给一个数组,我是一个小偷,目的是偷到最多的钱,规则是偷的时候一家偷完之后下一家不能再偷,否则会触发警报,则求可以偷到最多的钱。
求最值,使用动态规划,可以用dp[i]表示0到i可以偷到最多的钱,则返回最后一个dp值即可。
dp[i]=dp[i-1]或者是dp[i-2]加num[i],这两个中最大的一个。
初值是dp[0]=0,dp[1]=num[0],dp[2]=max(num[1]+dp[0],dp[1])
则多设置一个值很重要。
class Solution {
public int rob(int[] nums) {
int l=nums.length;
if(l==0)return 0;
int[] dp=new int[nums.length+1];
dp[0]=0;
dp[1]=nums[0];
for(int i=2;i<=l;i++){
dp[i]=Math.max(nums[i-1]+dp[i-2],dp[i-1]);
}
return dp[l];
}
}