当前位置: 首页 > article >正文

从二维到一维:动态规划矩阵问题的优化之道

动态规划中的矩阵问题是非常经典的应用场景,比如最小路径和问题。这类问题很自然地可以想到使用二维 dp 数组来求解。
我们定义:
dp[i][j]
表示从矩阵的第 i行第 j列到右下角的最小路径和。

基本解法

求解过程从右下角开始,向左上角遍历,每次选择当前位置右方和下方的最小路径和来更新当前格子的状态。
状态转移方程为:
dp[i][j] = grid[i][j] + min(dp[i+1][j], dp[i][j+1])

在这里插入图片描述在这里插入图片描述

这种方法思路清晰,容易实现。然而,空间复杂度O(NM),有优化的空间。


优化空间复杂度

通过观察可以发现,每次计算某个位置时,只需要用到当前位置的右方下方的状态值。因此,我们可以用一个 一维数组 dp 来代替二维数组,从而将空间复杂度优化为 O(N)

优化方法

我们仍然从矩阵右下角开始倒序遍历。假设当前 dp 数组表示最后一行的状态,状态转移方程如下:

  1. 遍历最后一行
    因为最后一行没有下方格子,所以每个位置的状态只需要考虑右方状态:
    dp[j] = grid[i][j] + dp[j+1]

  2. 遍历最后一列
    因为最后一列没有右方格子,所以每个位置的状态只需要考虑下方状态(即当前 dp[j]):
    dp[j] = grid[i][j] + dp[j]

  3. 遍历其他位置
    对于矩阵中其他位置,需要同时参考右方和下方状态:
    dp[j] = grid[i][j] + min(dp[j], dp[j+1])

这样,dp 数组在整个计算过程中始终保持当前位置右方和下方的最小路径和。

实现代码

def minPathSum(self, grid: List[List[int]]) -> int:
        rows = len(grid)
        cols = len(grid[0])
        dp = grid[rows-1]
        for i in range(rows - 1, -1, -1):
            for j in range(cols - 1, -1, -1):
                if i == rows - 1 and j == cols - 1:
                    continue
                elif i == rows - 1:
                    dp[j] += dp[j+1]
                elif j == cols - 1:
                    dp[j] += grid[i][j]
                else:
                    dp[j] = min(dp[j],dp[j+1])+grid[i][j]
        return dp[0]

类似题目

不同路径
不同路径II
三角形最小路径和


http://www.kler.cn/a/397724.html

相关文章:

  • 嵌入式课程day13-C语言指针
  • leetcode面试 150题之 三数之和 复刷日记
  • 力扣刷题日记之150.逆波兰表达式求值
  • 计算机网络WebSocket——针对实习面试
  • 一文详细深入总结服务器选型
  • MySQL缓存使用率超过80%的解决方法
  • spring-cache concurrentHashMap 自定义过期时间
  • 将 HTML 转换为 JSX:JSX 和 JSX 规则
  • 【项目开发】分析六种常用软件架构
  • ISCTF2024
  • 算法沉淀一:双指针
  • 【Android Compose原创组件】可拖动滚动条的完美实现
  • 算法:快排(三指针算法)
  • YashanDB 23.2.3安装过程,并使用DBeaver进行连接
  • 【如何获取股票数据47】Python、Java等多种主流语言实例演示获取股票行情api接口之沪深指数历史分时KDJ数据获取实例演示及接口API说明文档
  • windows C#-创建记录类型(下)
  • Vue3 -- 项目配置之eslint【企业级项目配置保姆级教程1】
  • mysql数据迁移PolarDB
  • ubuntu安装 Pycharm
  • Prometheus面试内容整理-数据持久化和高可用
  • cocosCreator视频web模式播放踩坑解决
  • 分页查询我的课表
  • 性能高于Transformer模型1.7-2倍,彩云科技发布基于DCFormer架构通用大模型云锦天章
  • 什么是Spring Boot Actuator
  • 第二十二章 TCP 客户端 服务器通信 - TCP设备的OPEN和USE命令关键字
  • 【网络云计算】2024第46周周考-磁盘管理的基础知识-RAID篇