【动态规划】【待更新】

文章目录


1.爬楼梯⭐

维护数组 dpi 表示:爬到第 i 阶楼梯,一共有多少种方法

  • 如何到达第 i 阶,只能有两种情况 dp[i] = dp[i-1] + dp[i-2]
    • 从第 i-1 阶走一步
    • 从第 i-2 阶走两步
  • 初始时 dp0=1 (从第0阶出发到第0阶),dp1=1,dp2=dp0 + dp1=2,以此类推
  • 注意0代表一层,dpi+1
java 复制代码
public int climbStairs(int n) {
    if(n <3) return n;
    int[]dp = new int[n+1];
    //0层表示0步骤
    //dp[n]表示到达了第n层
    dp[0] = 1;
    dp[1] = 1;
    for (int i = 2; i <= n; i++) {
        dp[i] = dp[i-1] + dp[i-2];
    }
    return dp[n];
}
  • 时间复杂度 O(n)

2.杨辉三角

  • 每一层的长度 len = i+1
  • dpnn,dpn0 = 1,dpnlen = 1
  • dpij = dpi-1j-1+ dpi-1j
bash 复制代码
n=5
[
     [1],
    [1,1],
   [1,2,1],
  [1,3,3,1],
 [1,4,6,4,1]
]
java 复制代码
public static List<List<Integer>> generate(int numRows) {
    //每一行的数字个数
    int n = 1;
    List<List<Integer>> list = new ArrayList<>();
    int[][] dp = new int[numRows][numRows];
    for(int i = 0; i < numRows; i++){
        //每层需要初始化tmp
        List<Integer> tmp = new ArrayList<>();
        for(int j = 0; j <= i; j++){
            //头和尾
            if(j == 0 || j == i){
                dp[i][j] = 1;
                tmp.add(1);
            }else {
                dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j];
                tmp.add(dp[i][j]);
            }
        }
        //加入list
        list.add(tmp);
    }
    return list;
}
  • 在原list上进行修改
java 复制代码
public List<List<Integer>> generate(int numRows) {
    List<List<Integer>> result = new ArrayList<>();
    for(int i = 0; i < numRows; i++){
        List<Integer> row = new ArrayList<>();
        // 当前行有 i+1 个数字
        for(int j = 0; j <= i; j++){
            // 两边都是1
            if(j == 0 || j == i){
                row.add(1);
            }else{
                // 中间位置
                int value =
                    result.get(i-1).get(j-1)
                    +
                    result.get(i-1).get(j);
                row.add(value);
            }
        }
        result.add(row);
    }
    return result;
}

3.打家劫舍

dpi 表示:偷窃前 i+1 间房屋,可以获得的最大金额。

相关推荐
AgentMaster1 小时前
开源智能客服系统技术对比:从架构设计到生产部署的实战指南
大数据·人工智能·算法
我不会起名字3221 小时前
一天一道算法题(35):电话号码的字母组合
java·数据结构·后端·python·leetcode·go·回溯
麻瓜code1 小时前
【JUC】基础:并发模型、锁机制与 JMM
java
曹牧1 小时前
SpringBoot: @RequestBody String
java
weixin_307779131 小时前
C++代码实现MATLAB中的ode23t函数功能
开发语言·c++·算法·matlab
爱划水不秃头的程序员1 小时前
堆 栈 和常量池的关系是啥 是jvm对他们进行的划分吗
java
周GZ1 小时前
4个提问,deepseek讲解Java中的线程池
java
LuTshoes2 小时前
context 上下文工程
java·人工智能·spring·ai
wuminyu2 小时前
Markword在紧凑对象头上的实现原理剖析
java·linux·c语言·jvm·c++