class Solution {
public static int[] cache;
public int rob(int[] nums) {
int n = nums.length;
int[] f = new int[n+2];
for(int i=0;i<n;i++) {
f[i+2] = Math.max(f[i+1],f[i]+nums[i]);
}
return f[n+1];
}
public int dfs(int i,int[] nums) {
if(i<0) return 0;
if(cache[i]!=-1) return cache[i];
int res = Math.max(dfs(i-1,nums), dfs(i-2,nums)+nums[i]);
cache[i] = res;
return res;
}
}
function rob(nums: number[]): number {
let dp = new Array(nums.length).fill(0);
dp[0] = nums[0];
for (let i = 1; i < nums.length; i++) {
let right = i >= 2 ? dp[i - 2] : 0;
dp[i] = Math.max(dp[i-1],right + nums[i]);
}
return dp[nums.length - 1];
};
共以下 10 个回答
递归:从上到下
递推:从下到上
以前做过,想出来了
dp[i]表示以第i家之前可以偷的最大钱数
class Solution {
public int rob(int[] nums) {
//从第四间开始考虑 -2 -3
int dp[]=new int[nums.length+1];
dp[0]=0;
dp[1]=nums[0];
if(nums.length1) return dp[1];
dp[2]=nums[1];
if(nums.length2)
return Math.max(dp[1],dp[2]);
int max = Math.max(dp[1],dp[2]);
for(int i=3;i<=nums.length;i++)
{
dp[i]=Math.max(dp[i-2]+nums[i-1],dp[i-3]+nums[i-1]);
max =Math.max(dp[i],max);
}
return max;
}
8.9 周三
Day30:下面是代码