【动态规划】路径问题

简介: 【动态规划】路径问题

动态规划(路径问题)

1. 不同路径 |

题目链接

  1. 状态表示
    dp[i][j] 表示以i,j为结尾的时候,有多少中路径
  2. 状态转移方程
  3. 初始化
    初始化的地方采用虚拟节点的办法。辅助节点里面的值要保证后续的填表是正确的,并且下标的映射关系要正确
    这里必须保证阴影部分有一个地方为1,这样就能保证初始化是正确的
  1. 填表
    从上到下,从左到右
  2. 返回值

AC代码:

class Solution 
{
public:
    int uniquePaths(int m, int n) 
    {
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
        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. 不同路径 ||

题目链接

  1. 状态表示
    dp[i][j]表示到i, j 位置有多少种路径
  2. 状态转移方程

如果是障碍物,不需要处理这个节点位置,

  1. 初始化
    初始化,仍然采用辅助节点的方式
  1. 填表
    从上到下,从左到右
  2. 返回值

AC代码:

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, 0));
        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. 礼物的最大价值

题目链接

  1. 状态表示
    dp[i][j]表示到i, j位置时最大的价值
  2. 状态转移方程

  1. 初始化
    仍然采用虚拟节点的方法,来初始化。这里只需要将虚拟节点里面的值都初始化为0即可
  2. 填表
    从上到下,从左到右
  3. 返回值

AC代码:

class Solution 
{
public:
    int maxValue(vector<vector<int>>& grid) 
    {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
        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]) + grid[i - 1][j - 1];
            }
        }
        return dp[m][n];
    }
};

4. 下降最小和

题目链接

  1. 状态表示
    dp[i][j]表示到i, j 位置时的最小和
  2. 状态转移方程

  3. 初始化
    这里虚拟节点,需要加一行再加上两列
  4. 填表
    从上往下,从左到右
  5. 返回值
    最后一行的最小值

AC代码:

class Solution 
{
public:
    int minFallingPathSum(vector<vector<int>>& matrix) 
    {
        int m = matrix.size();
        vector<vector<int>> dp(m + 1, vector<int>(m + 2, INT_MAX));
        for (int j = 0; j < m + 2; j++)
        {
            dp[0][j] = 0;
        }
        for (int i = 1; i <= m; i++)
        {
            for (int j = 1; j <= m; j++)
            {
                dp[i][j] = min(min(dp[i - 1][j - 1], dp[i - 1][j]), dp[i - 1][j + 1]) + matrix[i - 1][j - 1];
            }
        }
        int ret = INT_MAX;
        for (int j = 1; j <= m; j++)
        {
            ret = min(ret, dp[m][j]);
        }
        return ret;
    }
};

5. 最小路径和

题目链接

  1. 状态表示
    dp[i][j]表示i, j 位置时,最小的路径和
  2. 状态转移方程

  3. 初始化
    虚拟节点,方便初始化
  4. 填表
  5. 返回值

AC代码:

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] = dp[1][0] = 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. 地下城游戏

题目链接

  1. 状态表示
    如果当以i, j 位置结尾所需的最低健康点数,为状态表示的时候,后面的节点也会影响这个节点的值。所以以某个位置为结尾的时候不能很好的解决这个题目。换一个状态表示:
    如果以i, j为开始到达终点的所需健康点数,就可以很好的解决这个题目
  2. 状态转移方程

dp[i][j] + d[i][j] >= dp[i][j + 1],需要注意的是当是一个负数的时候需要改为1

  1. 初始化
  2. 填表
    从下往上,从右到左
  3. 返回值

AC代码:

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][j + 1], dp[i + 1][j]) - dungeon[i][j];
                dp[i][j] = max(1, dp[i][j]);
            }
        }
        return dp[0][0];
    }
};
相关文章
|
网络协议
内网穿透的原理和实现方式
一、定义 内网穿透也成NAT穿透,进行NAT穿透是为了使具有某一个特定源IP地址和源端口号的数据包不被NAT设备屏蔽而正确路由到内网主机。
|
监控 负载均衡 网络协议
OSPF在小型网络中的应用:简化配置与高效管理
OSPF在小型网络中的应用:简化配置与高效管理
495 1
|
11月前
|
人工智能 程序员 开发者
如何使用Ascend的ATB加速库?
ATB加速库专为Transformer模型优化设计,基于华为Ascend AI处理器,提升训练和推理效率。本文档详细介绍了如何实现一个ATB算子,涵盖基础Operation、插件机制和Graph Frame三种方式,从环境准备、算子创建、资源管理到最终执行,提供了完整的代码示例和步骤指南,帮助开发者快速掌握ATB算子的开发流程。
|
数据采集 SQL 数据管理
读数据质量管理:数据可靠性与数据质量问题解决之道05数据标准化
【11月更文挑战第9天】《数据质量管理:数据可靠性与数据质量问题解决之道 - 05 数据标准化》介绍了数据标准化在数据质量管理中的重要性。文章从提高数据一致性、提升数据整合效率、增强数据分析准确性三个方面阐述了数据标准化的关键作用,并详细说明了格式、编码、度量单位的标准化内容及实施方法。此外,还介绍了常用的数据清洗工具和编程语言,以及数据标准化的实施流程,包括现状评估、标准制定、数据转换和验证监控。
309 8
|
机器学习/深度学习 人工智能 并行计算
GPU 和 CPU 处理器的架构
CPU(中央处理器)和 GPU(图形处理单元)是计算机系统中最重要的两种处理器。它们各自的架构设计和技术体系决定了其在不同应用领域中的性能和效率。
647 1
|
弹性计算 负载均衡 数据库
2024阿里云服务器试用规则及云产品试用常见问题解答
2024年阿里云服务器可以试用吗?不仅是云服务器产品,包括无影云电脑、云数据库 RDS、统型负载均衡 CLB、对象存储 OSS、文件存储 NAS等云产品都是可以试用的,只是需要注意的是,我们在试用云服务器产品之后,免费试用权益无法与新用户优惠购买活动同享,也就是说,领取了云服务器ECS免费试用权益的用户,将不能参产品新用户的相关活动。本文为大家介绍2024年阿里云服务器和其他云产品的试用规则及试用常见问题解答。
2024阿里云服务器试用规则及云产品试用常见问题解答
|
SQL 关系型数据库 MySQL
必知的 MySQL 索引失效场景【包括实践验证】,别再踩坑了!(上)
必知的 MySQL 索引失效场景【包括实践验证】,别再踩坑了!
1627 2
|
Java 测试技术 Python
《手把手教你》系列技巧篇(二十七)-java+ selenium自动化测试- quit和close的区别(详解教程)
【4月更文挑战第19天】本文介绍了WebDriver中关闭浏览器的两个方法:close和quit。close方法关闭当前窗口,如果这是最后一个窗口,浏览器也会退出。quit方法则直接退出浏览器并关闭所有关联窗口。示例代码展示了两者的区别,通常在自动化测试后使用quit来彻底关闭浏览器。close和quit在HTTP请求上的差异也进行了说明,close请求的是 `/session/{session id}/window/current`,而quit请求的是 `/session/{session id}`。
294 8
|
编解码 数据可视化 JavaScript
Google Earth Engine(GEE)——10分钟短文快速了解地球引擎和森林面积损失计算
Google Earth Engine(GEE)——10分钟短文快速了解地球引擎和森林面积损失计算
682 0