【动态规划】【待更新】

文章目录


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 间房屋,可以获得的最大金额。

相关推荐
longlongzihan3 小时前
LeetCode 189. 轮转数组:从直观模拟到最优原地算法
c++·算法·leetcode
爱喝热水的呀哈喽3 小时前
cpp二分库函数 lambda捕获
算法
imDwAaY3 小时前
Spring Boot的核心配置文件一览及其加载顺序
java·spring boot·后端
zhangx1234_3 小时前
javaEE 多线程1
java·linux·服务器
鬼手点金3 小时前
opencode-crawl4ai使用建议
java·开发语言·人工智能·python·机器学习
longlongzihan3 小时前
LeetCode 76. 最小覆盖子串:滑动窗口算法详解
算法·leetcode·滑动窗口
专业程序开发源3 小时前
springboot校园志愿者管理系统28562-计算机课程设计、毕业设计
java·spring boot·后端·python·django·php·课程设计
thefool1122663 小时前
多线程 2
java
写后端的胖头鱼11 小时前
一文详解B+树原理(附场景+示例)
数据结构·b树
怕浪猫12 小时前
RAG 面试 6 连问,从原理到优化全部覆盖
python·算法·面试