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

hot100 -- 16.多维动态规划

1.不同路径

问题:

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

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

问总共有多少条不同的路径?

方法1:二维动态规划

def uniquePaths(m, n):grid = [[1 for i in range(n)] for j in range(m)]for i in range(1, m):for j in range(1, n):grid[i][j] = grid[i-1][j] + grid[i][j-1]return grid[-1][-1]

方法2:空间优化 -- 逐行迭代

每次运算,上一行的数据已由dp数组保留下来,相当于只用加左边数据即可(存储降维)

# 方法2:空间优化 -- 逐行迭代
# 每次运算,上一行的数据已由dp数组保留下来,相当于只用加左边数据即可(存储降维)
def uniquePaths(m, n):dp = [1] * nfor i in range(1, m):for j in range(1, n):dp[j] += dp[j-1]return dp[-1]

2.最小路径和

问题:

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。

方法1:二维动态规划(二维dp数组)

# 方法1:二维动态规划(二维dp数组)
def minPathSum(grid):dp = [[1 for i in range(len(grid[0]))] for j in range(len(grid))]# 首行首列初始化:dp[0][0] = grid[0][0]for i in range(1, len(grid)):dp[i][0] = dp[i-1][0] + grid[i][0]for j in range(1, len(grid[0])):dp[0][j] = dp[0][j-1] + grid[0][j]for i in range(1, len(grid)):for j in range(1, len(grid[0])):dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]return dp[-1][-1]

方法2:空间优化(一维dp数组)

# 方法2:空间优化(一维dp数组)
def minPathSum(grid):dp = [1 for _ in range(len(grid[0]))]# 首行初始化dp[0] = grid[0][0]for j in range(1, len(grid[0])):dp[j] = dp[j-1] + grid[0][j]# 逐行运算for i in range(1, len(grid)):dp[0] += grid[i][0]                             # 首列初始化for j in range(1, len(grid[0])):dp[j] = min(dp[j], dp[j-1]) + grid[i][j]    # min(上方, 左方) + 当前元素值return dp[-1]

方法3:空间再优化(原地替换)

# 方法3:空间再优化(原地替换)
def minPathSum(grid):# 首行首列初始化for i in range(1, len(grid)):grid[i][0] += grid[i-1][0]for j in range(1, len(grid[0])):grid[0][j] += grid[0][j-1]for i in range(1, len(grid)):for j in range(1, len(grid[0])):grid[i][j] = min(grid[i-1][j], grid[i][j-1]) + grid[i][j]   # 原地替换return grid[-1][-1]

http://www.lqws.cn/news/482023.html

相关文章:

  • 分布式ID生成方式及优缺点详解
  • Azure Devops
  • 时序数据库IoTDB的架构、安装启动方法与数据模式总结
  • 在线法律服务平台、AI法律问答、律师管理、案件管理、聊天、法律博客
  • ollama + dify 搭建本地知识库
  • MongoDB 8.0.10 windows11安装记录
  • Golang 中接口嵌套的详细说明和使用示例
  • (LeetCode 面试经典 150 题 ) 189. 轮转数组(字符串、双指针)
  • 日语学习-日语知识点小记-进阶-JLPT-真题训练-N2阶段(3):单词2018年12月2024年7月
  • 语音识别提取文本
  • LINUX 622 SAMBA
  • Linux系统基本操作指令
  • Docker Desktop + Kubernetes 使用 hostPath 持久化挂载“坑点”全解析
  • Python 爬虫简单示例
  • JAVA集合篇--深入理解ConcurrentHashMap图解版
  • Python 深度学习基础:TensorFlow 入门——从张量到神经网络的实战指南
  • Kafka 源码剖析:消息存储与协议实现(二)
  • GIT学习笔记
  • Cursor快速上手+科学使用指南
  • EMD与PI:战略与执行的协同
  • 【数据结构与算法】数据结构核心概念系统梳理
  • IntelliJ IDEA 中 Update Project 与 Git Pull
  • Linux内核中安全创建套接字:为何inet_create未导出及正确替代方案
  • 性能测试之接口关联和函数使用
  • Spring JDBC配置与使用
  • 【DDD】——带你领略领域驱动设计的独特魅力
  • redis相关面试题
  • React基础
  • 64-Oracle Redo Log
  • Python商务数据分析——Python 入门基础知识学习笔记