题目:
思路:
动态规划涉及到最优子结构和重叠子问题,重叠子问题需要备忘录,最优子结构需要判断有没有出现
代码:
自顶向下
class Solution {
int[] memo ;
public int rob(int[] nums) {
//对于memo进行初始化
memo =new int[nums.length];
Arrays.fill(memo,-1);
//从0开始对dp进行扫描
return dp(nums,0);
}
//挂数组和起始位置
public int dp(int[] nums,int start){
//如果越界
if(start>=nums.length){
return 0;
}
//涉及到memo去重
if(memo[start]!=-1) return memo[start];
//抢下一家还是抢当前这家
int res = Math.max(dp(nums,start+1),nums[start]+dp(nums,start+2));
//第一个是抢下一家
//第二个是抢这家
//计入备忘录
memo[start] = res;
return res;
}
}
自底向上
代码:
class Solution {
int[] memo ;
public int rob(int[] nums) {
//对于memo进行初始化
int[] dp = new int[nums.length+2];
for(int i = nums.length-1;i>=0;i--){
//后面推前面的
//dp[i]由dp[i+1]和dp[i+2]汇总
dp[i] = Math.max(dp[i+1],nums[i]+dp[i+2]);
}
return dp[0];
}
}
优化:
思路:
观察dp[i]和附近状态有关转换为0(1)
class Solution {
int[] memo ;
public int rob(int[] nums) {
//对于memo进行初始化
int dp0=0,dp1=0,dp2=0;
for(int i = nums.length-1;i>=0;i--){
//后面推前面的
//dp[i]由dp[i+1]和dp[i+2]汇总
dp0 = Math.max(dp1,dp2+nums[i]);
dp2 = dp1;
dp1 = dp0;
}
return dp0;
}
}