C++ 路径问题

目录

例1

例2

例3

例4

例5

例6


例1

62. 不同路径

1.初始化

2.当前位置的条数,就是上面位置的条数 ,加上其左边位置的条数,dpij = dpi - 1j + dpij - 1;

参考代码

cpp 复制代码
class Solution {
public:
    int uniquePaths(int m, int n) {
        vector<vector<int>> dp(m + 1, vector<int>(n + 1));
        dp[0][1] = 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][n];
    }
};

例2

63. 不同路径 II

1.初始化dp

2.将obstacleGrid中为0 的值映射到dp表中为0即可

参考代码

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

例3

LCR 166. 珠宝的最高价值

初始化默认为0,且题目中说了,价值都是大于0

因为是求右下角的值,那么dp就是从左上往右下

参考代码

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

例4

931. 下降路径最小和

注意:如果没有这一行for(int i = 0; i < n + 2; i++) dp0i = 0;会溢出,如果改成longlong的vector,那么这时候min会出现没有匹配的模版,因为类型不同,并不是min写错了,官方文档

参考代码

cpp 复制代码
class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& matrix) {
        int n = matrix.size();
        vector<vector<int>> dp(n + 1, vector<int>(n + 2, INT_MAX));
        for(int i = 0; i < n + 2; i++) dp[0][i] = 0;
        for(int i = 1; i <= n; i++)
            for(int j = 1; j <= n; j++)
                dp[i][j] = min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i - 1][j + 1])) + matrix[i - 1][j - 1];
        int ret = INT_MAX;
        for(int i = 1; i <= n; i++)
            ret = min(ret, dp[n][i]);//没有int和long long 的比较
        return ret;
    }
};

例5

64. 最小路径和

最小:::初始化为INT_MAX;

dp01 = 0方便dp11

映射

参考代码

cpp 复制代码
class Solution {
public:
    int minPathSum(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
        dp[0][1] = 0;
        for(int i = 1; i <= m; i++)
            for(int j = 1; j <= n; j++)
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
        return dp[m][n];
    }
};

例6

174. 地下城游戏

求的是dp00,那么就是从左下往右上填写dp表

这里不用映射

dp表里的值代表的是+-之后的血量,dpmn - 1 = dpm - 1n = 1;这一步代表走到这俩位置还能保持一格血,这俩位置不会+-血,也就是 +- 完dpm - 1n - 1后还剩下1滴血

dpij = min(dpi + 1j, dpij + 1) - dungeonij;等价于:当前需要的血量 = 下一步较小的血量 - 需要+-的血量,如果所需是0,则改成1

参考代码

cpp 复制代码
class Solution {
public:
    int calculateMinimumHP(vector<vector<int>>& dungeon) {
        int m = dungeon.size(), n = dungeon[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, INT_MAX));
        dp[m][n - 1] = dp[m - 1][n] = 1;
        for(int i = m - 1; i >= 0; i--)
            for(int j = n - 1; j >= 0; j--)
            {
                dp[i][j] = min(dp[i + 1][j], dp[i][j + 1]) - dungeon[i][j];
                dp[i][j] = max(1, dp[i][j]);
            }
        return dp[0][0];
    }
};
相关推荐
血小板要健康7 分钟前
链表 阶段算法总结
java·数据结构·笔记·算法·leetcode·链表
a1879272183115 分钟前
【算法】回溯算法(三):三记重锤与 N 皇后——记忆化、状态设计与三层漏斗
算法·leetcode·go·剪枝·回溯·n皇后·算法讲解
HugoStudio_SWAN2 小时前
洛谷 P1420 / P1179 / B4262 最长连号、数字统计与词频统计——统计的三种面孔
c++·学习·程序人生·算法
青 春 记 忆3 小时前
LeetCode 350. 两个数组的交集 II|Python 解法详解
python·算法·leetcode
raindayinrain3 小时前
c++并发
c++
j7~3 小时前
【C++】智能指针的使用及其原理--详解
c++·c++11·内存泄漏·智能指针·raii·boost智能指针
阳明山水4 小时前
销量预测2025—2026:从模型竞赛到系统融合的范式转型
人工智能·深度学习·算法·机器学习·架构
桐盛科技4 小时前
拒绝“漂绿”风险:基于边缘计算的碳排放数据清洗算法与实时校验逻辑
人工智能·算法·边缘计算
wuyk5554 小时前
107.FreeRTOS 链表深度解析:从原理到面试满分答案
c语言·开发语言·数据结构·stm32·单片机·链表·面试
-dzk-4 小时前
【链表】LC 138.随机链表的复制
数据结构·链表