算法入门(七):动态规划 - 网格路径 (Leetcode 62 / 63)

算法入门(七):动态规划 - 网格路径

    • [Leetcode 62 - 不同路径](#Leetcode 62 - 不同路径)
    • [Leetcode 63 - 不同路径 II](#Leetcode 63 - 不同路径 II)

Leetcode 62 - 不同路径

Leetcode 62 - 不同路径

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 "Finish" )。

dpij :表示从(0 ,0)出发,到(i, j) 有dpij条不同的路径。

首先我们尝试写下第0列和第0行的情况,dp0,0是没有意义的,第一行和第一列每个格子都是1,代表到达该格子的路径有一条。

现在着眼于dp1,1。因为机器人只能向下或者向右走,所以,dp1,1是由dp1,0和dp0,1所加得到的,也就是两条,于是我们找到了规律dpi,j = dpi-1,j+dpi,j-1。

接下来我们尝试补齐整个表格,dpn-1,m-1很容易就得到了。

代码的思路如下:

  • 创建一个二维数组,尺寸为 m x n 。全部初始化为1 或者 分别用两个循环把第0行和第0列都设为1都可以。
  • 当i<=m-1,j<=n-1时,dpi,j = dpi-1,j+dpi,j-1。

很自然就写出代码:

cpp 复制代码
class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m,vector<int>(n,1));
        for(int i = 1;i<m;i++){
            for(int j = 1;j<n;j++){
                dp[i][j] = dp[i-1][j] + dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }
};

Leetcode 63 - 不同路径 II

Leetcode 63 - 不同路径 II

不同于上一题,这次连矩阵的大小都没有给,首先需要确定m和n:

cpp 复制代码
int m = obstacleGrid.size();
int n = obstacleGrid[0].size();

有了m和n,初始化dp数组。这里就不能按心情来设置0或1了,而是要设置0,后面会解释:

cpp 复制代码
vector<vector<int>> dp(m,vector<int>(n,0));

因为首行首列可能会有障碍,甚至起始点也会有障碍,所以需要做以下处理:

cpp 复制代码
		//处理0,0
        if(obstacleGrid[0][0] ==1){
            return 0;
        }
        dp[0][0] = 1;

        //处理首行首列
        for(int i = 1;i<n;i++){
            if(obstacleGrid[0][i]==0){
                dp[0][i] = 1;
            }else{
                break; //if gird[0][i]==1,遇到障碍,后面所有的网格都无法到达,break跳出整个循环,
            }
        }
        for(int i = 1;i<m;i++){
            if(obstacleGrid[i][0]==0){
                dp[i][0] = 1;
            }else{
                break;
            }
        }

之后的代码与上一题完全一样,完整代码如下:

cpp 复制代码
class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        vector<vector<int>> dp(m,vector<int>(n,0));
        //处理0,0
        if(obstacleGrid[0][0] ==1){
            return 0;
        }
        dp[0][0] = 1;

        //处理首行首列
        for(int i = 1;i<n;i++){
            if(obstacleGrid[0][i]==0){
                dp[0][i] = 1;
            }else{
                break;
            }
        }
        for(int i = 1;i<m;i++){
            if(obstacleGrid[i][0]==0){
                dp[i][0] = 1;
            }else{
                break;
            }
        }
        for(int i = 1;i<m;i++){
            for(int j = 1;j<n;j++){
                if(obstacleGrid[i][j] == 1){
                    dp[i][j] = 0;
                }else{
                    dp[i][j] = dp[i-1][j] + dp[i][j-1];
                }
            }
        }
        return dp[m-1][n-1];
    }
};
相关推荐
凤凰院凶涛QAQ9 小时前
《Java版数据结构 & 集合类剖析》Map & Set & 反射:“从哈希碰撞到红黑树转换,反射帮你扒开 HashMap 的桶数组看个究竟”
java·数据结构·算法
w_zero_one10 小时前
算法--模拟
java·数据结构·算法
秋天的怀念_David11 小时前
算法一千零一夜 · 第十三夜 幻方,武侠世界里的数学迷宫
java·程序人生·算法
秋天的怀念_David11 小时前
算法一千零一夜 · 第十四夜 幻方与奇妙的二进制
java·程序人生·算法
薛定e的猫咪12 小时前
(ICLR 2020)MAML 靠的不是快速学习,而是特征复用
人工智能·深度学习·学习·算法·机器学习
薛定e的猫咪12 小时前
(ICLR 2026)DF-META:面向 FJSP 的无导数元学习实例自适应调度
人工智能·深度学习·学习·算法·机器学习
小羊没烦恼!14 小时前
异步编程:线程概述及使用
java·开发语言·mysql·算法·c#
wanderist.14 小时前
202609CSP认证P3
算法
云淡风轻~窗明几净14 小时前
角谷猜想最接近严格证明的测试 Version1.1.1
人工智能·算法·机器学习·图论
机器学习之心15 小时前
PINN × SVM × NSGA-II × 熵权TOPSIS:一套跑通「建模—优化—决策」的多目标优化框架
算法·机器学习·支持向量机