代码随想录第36天|动态规划

62. 不同路径


补充: 对二维数组的操作

  1. dp[j][i] 表示到 j,i 有多少种路径
  2. 递推公式: dp[j][i] = dp[j - 1][i] + dp[j][i - 1]
  3. 初始化: dp[0][i] 和 dp[j][0] 都只有1种情况
  4. 遍历顺序: 由于dp[j][i] 由 上和左的元素推导, 所以采用从左到右、从上到下的遍历顺序
cpp 复制代码
class Solution {
public:
    void uniquePaths(int m, int n) {
        vector<vector<int>> dp(m, vector<int>(n, 0));
        //初始化
        for (int i = 0; i < dp[0].size(); i++) dp[0][i] = 1;
        for (int i = 0; i < dp.size(); i++) dp[i][0] = 1;
        //递推公式
        for (int j = 1; j < m; j++) {
            for (int i = 1; i < n; i++) {
                dp[j][i] = dp[j][i - 1] + dp[j - 1][i];
            }
        }
        //输出dp[j][i]
        for (int j = 0; j < dp.size(); j++) {
            for (int i = 0; i < dp[i].size(); i++) {
                cout << dp[j][i] << " ";
            }
            cout << endl;
        }
        return dp[m - 1][n - 1];                  
    }
};

63. 不同路径 II



参考

  1. dp[j][i] 表示到(j, i) 后的路径数
  2. 递推公式
  3. 初始化 dp[0][i] 和 dp[j][0] 为 1 ,当遇到障碍物后变 0
  4. 遍历顺序同上
cpp 复制代码
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int n = obstacleGrid[0].size();
        int m = obstacleGrid.size();        
        vector<vector<int>> dp = vector<vector<int>>(m, vector<int>(n, 0));
        for (int i = 0; i < n; i++) {
            if (obstacleGrid[0][i] == 1) break;
            dp[0][i] = 1;
        }
        for (int j = 0; j < m; j++) {
            if (obstacleGrid[j][0] == 1) break;
            dp[j][0] = 1;
        }

        for (int j = 1; j < m; j++) {
            for (int i = 1; i < n; i++) {
                if (obstacleGrid[j][i] == 1) {//该点有障碍
                    dp[j][i] = 0;                    
                } else {
                    dp[j][i] = dp[j][i - 1] + dp[j - 1][i];
                }              
            }
        }
        return dp[m - 1][n - 1];
    }
};

343. 整数拆分

  1. dp[i] : 整数i的最大乘积
  2. 递推公式
  3. 初始化
  4. 遍历顺序

未弄懂


96. 不同的二叉搜索树

相关推荐
张人玉1 小时前
C# 常量与变量
java·算法·c#
weixin_446122462 小时前
LinkedList剖析
算法
百年孤独_3 小时前
LeetCode 算法题解:链表与二叉树相关问题 打打卡
算法·leetcode·链表
我爱C编程3 小时前
基于拓扑结构检测的LDPC稀疏校验矩阵高阶环检测算法matlab仿真
算法·matlab·矩阵·ldpc·环检测
算法_小学生3 小时前
LeetCode 75. 颜色分类(荷兰国旗问题)
算法·leetcode·职场和发展
运器1233 小时前
【一起来学AI大模型】算法核心:数组/哈希表/树/排序/动态规划(LeetCode精练)
开发语言·人工智能·python·算法·ai·散列表·ai编程
算法_小学生3 小时前
LeetCode 287. 寻找重复数(不修改数组 + O(1) 空间)
数据结构·算法·leetcode
岁忧3 小时前
(LeetCode 每日一题) 1865. 找出和为指定值的下标对 (哈希表)
java·c++·算法·leetcode·go·散列表
alphaTao3 小时前
LeetCode 每日一题 2025/6/30-2025/7/6
算法·leetcode·职场和发展
ゞ 正在缓冲99%…3 小时前
leetcode67.二进制求和
算法·leetcode·位运算