Leetcode-动态规划

198. 打家劫舍 - 力扣(LeetCode)

首先用回溯的方法来思考 虽然会超时但是这是后面记忆化搜索的根基

从最后一家开始打 有两种情况 要么打 要么不打 打或者不打 都有可能产生最终答案

因此想到可以用回溯 在回溯的过程用max记录最大值 最后返回

但是这种写法其实重复计算了很多次

例如一开始选择4不打3不打 然后进入子问题2计算得出这种走法的最大值 但是另一种情况 一开始选4 然后选2 也就是右边的子树 其实和前面43都不选后选2的子树是一模一样的 因此我们可以将这个计算后的答案记录下来 如果一种走法被记录过了就不再递归 这样就可以降低时间复杂度

java 复制代码
class Solution {
    int []nums;
    public int rob(int[] nums) {
        this.nums=nums;
        int n=nums.length;
        return dfs(n-1);
    }
    public int dfs(int i){
        if(i<0)return 0;
        int ans=Math.max(dfs(i-1),dfs(i-2)+nums[i]);
        return ans;
    }
}
java 复制代码
class Solution {
    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];
    }
}

递推写法:

将回溯的写法一比一翻译

用for循环代替递归

用两个0优先赋值

最后由于前面填充了两个0 答案就是i=n-1 再+2 n+1

java 复制代码
class Solution {
    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];
    }
}
相关推荐
Jack电子实验室7 分钟前
STM32实现智能温控系统(暖手宝):PID 算法 + DS18B20+OLED 显示,[学习 PID 优质项目]
stm32·学习·算法
KangkangLoveNLP8 分钟前
从概率到梯度:理解分类问题中交叉熵的优越性
人工智能·深度学习·算法·机器学习·分类·lstm·transformer
围巾哥萧尘27 分钟前
「原型设计」Trae AI & DeepSeek-Chat-V3 在微信小程序「倒计时」原型中的复现🧣
算法·ios·架构
Awesome Baron27 分钟前
LeetCode hot 100 每日一题(16)——240. 搜索二维矩阵 II
java·leetcode·矩阵
高山莫衣31 分钟前
【差分隐私相关概念】约束下的矩阵机制
线性代数·算法·矩阵
aimmon1 小时前
Rust从入门到精通之精通篇:24.高级异步编程
开发语言·算法·rust
小学仔1 小时前
### Java二维字符矩阵输入解析:正确读取由0和1组成的矩阵
java·算法·leetcode·矩阵·动态规划
菜鸟00881 小时前
蓝桥杯 第十天 2019国赛第4题 矩阵计数
算法·职场和发展·蓝桥杯
LinkerLin1 小时前
因果推理的智慧:当大模型遇见因果图谱
算法
小华同学ai2 小时前
17.1K star!两小时就能训练出专属于自己的个性化小模型,这个开源项目让AI触手可及!
算法·程序员·github