首页/新闻资讯/正文详情

动态规划解决网格路径问题:从暴力递归到空间优化

发布时间:2026/11/5 16:53:09 来源:云帆数科 栏目:资讯中心
动态规划解决网格路径问题:从暴力递归到空间优化
1. 问题背景与定义不同路径是一个经典的动态规划问题通常出现在算法学习的中级阶段。题目描述如下在一个m×n的网格中机器人位于左上角起点每次只能向右或向下移动一步问到达右下角终点共有多少条不同的路径。这个问题看似简单却蕴含着动态规划的核心思想——将大问题分解为子问题并存储子问题的解以避免重复计算。我第一次接触这个问题时被它简洁的表述和巧妙的解法所吸引后来在实际工作中发现类似的思路可以应用于路径规划、资源分配等多个场景。2. 暴力递归解法分析2.1 基础递归思路最直观的解法是使用递归到达(m,n)点的路径数等于到达(m-1,n)的路径数加上到达(m,n-1)的路径数。递归的终止条件是当m或n为1时只有一条直线路径。def uniquePaths(m, n): if m 1 or n 1: return 1 return uniquePaths(m-1, n) uniquePaths(m, n-1)2.2 递归解法的问题这种解法虽然简单但存在严重的性能问题。对于mn20的网格递归调用次数会达到惊人的百万级别时间复杂度是指数级的O(2^(mn))。我在第一次实现时就遇到了栈溢出和超时的问题这让我意识到需要更高效的解法。3. 动态规划解决方案3.1 动态规划思路动态规划通过存储中间结果来优化递归解法。我们可以创建一个二维数组dp其中dp[i][j]表示到达(i,j)点的路径数。根据移动规则状态转移方程为dp[i][j] dp[i-1][j] dp[i][j-1]边界条件是第一行和第一列的所有位置都只有1种路径。3.2 具体实现def uniquePaths(m, n): dp [[1]*n for _ in range(m)] for i in range(1, m): for j in range(1, n): dp[i][j] dp[i-1][j] dp[i][j-1] return dp[-1][-1]这个解法的时间复杂度是O(m×n)空间复杂度也是O(m×n)。在实际测试中即使是100×100的网格也能瞬间计算出结果。4. 空间优化技巧4.1 滚动数组优化观察状态转移方程可以发现当前行只依赖于上一行和当前行的前一个值。因此我们可以将空间复杂度优化到O(n)def uniquePaths(m, n): dp [1] * n for _ in range(1, m): for j in range(1, n): dp[j] dp[j-1] return dp[-1]4.2 数学组合数解法这个问题还可以用组合数学来解。从起点到终点需要移动(m-1)(n-1)步其中有(m-1)步是向下的因此路径总数等于C((m-1)(n-1), (m-1))。import math def uniquePaths(m, n): return math.comb(mn-2, m-1)这种解法的时间复杂度是O(1)但要注意阶乘计算的数值范围限制。在Python中这不是问题但在其他语言中可能需要处理大整数。5. 变种问题与实际应用5.1 带障碍物的不同路径在实际应用中网格中可能存在障碍物。这时我们需要修改动态规划方程遇到障碍物时路径数设为0def uniquePathsWithObstacles(obstacleGrid): m, n len(obstacleGrid), len(obstacleGrid[0]) dp [[0]*n for _ in range(m)] dp[0][0] 1 if obstacleGrid[0][0] 0 else 0 for i in range(1, m): dp[i][0] dp[i-1][0] if obstacleGrid[i][0] 0 else 0 for j in range(1, n): dp[0][j] dp[0][j-1] if obstacleGrid[0][j] 0 else 0 for i in range(1, m): for j in range(1, n): if obstacleGrid[i][j] 0: dp[i][j] dp[i-1][j] dp[i][j-1] else: dp[i][j] 0 return dp[-1][-1]5.2 三维空间的不同路径如果问题扩展到三维空间机器人可以向右、向下或向内移动解法思路类似只是状态转移方程变为dp[i][j][k] dp[i-1][j][k] dp[i][j-1][k] dp[i][j][k-1]5.3 实际应用场景物流路径规划计算仓库中AGV小车从起点到终点的可能路线电路板布线计算两点间的可能走线方式游戏AI评估角色移动到目标位置的可能性金融领域计算多种投资组合的可能性6. 性能对比与测试我在LeetCode上对不同解法进行了测试mn100时的平均运行时间递归解法超时1s基础DP0.12ms优化空间DP0.08ms组合数解法0.02ms测试结果表明组合数解法最快但在实际工程中带障碍物的变种问题更常见这时动态规划方法更具通用性。7. 常见错误与调试技巧7.1 边界条件处理新手常犯的错误是忽略边界条件。例如在m1或n1时应该直接返回1而不是继续递归。我在第一次实现时就因为这个错误导致了无限递归。7.2 数组索引越界在动态规划实现中要特别注意数组索引的范围。循环应该从1开始而不是0因为0行和0列已经初始化。7.3 空间优化的陷阱使用滚动数组优化时内层循环必须从左到右计算。如果错误地从右到左计算会使用已经更新的值导致结果错误。8. 扩展思考8.1 加权路径问题如果网格中的每一步有不同的权重成本问题就变成了寻找最小成本路径可以用Dijkstra算法或动态规划解决。8.2 多路径统计如果需要统计经过某些特定点的路径数量可以将问题分解为多个子路径的乘积。8.3 并行计算优化对于特别大的网格可以考虑将动态规划表分块使用并行计算来加速。这在GPU编程中尤其有效。

相关推荐

GreenHills mpythonrun.exe 进程隔离与调试器实例共享方案
GreenHills mpythonrun.exe 进程隔离与调试器实例共享方案

简介:本资源是一份面向嵌入式开发工程师与自动化测试实践者的Python-GreenHills集成技术指南,聚焦解决Python脚本调用GreenHills IDE内部功能的核心痛点,如跨命令行共享调试器实例、冗余输出清洗及subprocess安全调用等。文档以实操为导向&am… · 2026/11/5 3:15:13

多无人机协同路径规划与防撞系统设计
多无人机协同路径规划与防撞系统设计

1. 项目背景与核心挑战多无人机系统在动态环境中的协同作业已经成为工业巡检、灾害救援等领域的关键技术。这个项目要解决的是当多个无人机同时在复杂环境中飞行时,如何让它们既能高效完成各自任务,又能避免相互碰撞这个核心问题。去年参与某电力巡检项目… · 2026/11/5 3:08:47

技术博客写作重启:从习惯中断到持续输出的实践
技术博客写作重启:从习惯中断到持续输出的实践

1. 重新找回写作节奏的实践心得上周整理硬盘时突然发现,距离我上次认真写技术博客已经过去427天。这个数字让我自己都吃了一惊——作为一个曾经保持周更三年的老博主,居然让写作习惯中断了这么久。今天想聊聊这段空白期带给我的思考,以及重新… · 2026/11/5 10:11:22

FSoE黑通道完全解读:功能安全通信的设计与实战
FSoE黑通道完全解读:功能安全通信的设计与实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:07:13

嵌入式偶发故障排查实战:串口假故障、蓝牙断连与烧录失败
嵌入式偶发故障排查实战:串口假故障、蓝牙断连与烧录失败

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:07:13

智能车竞赛疯狂电路组硬件设计解析:从Buck电源到IR2110驱动
智能车竞赛疯狂电路组硬件设计解析:从Buck电源到IR2110驱动

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:07:13

工业控制器数据分级存储方案:EEPROM、NOR Flash与SD卡的选型与实现
工业控制器数据分级存储方案:EEPROM、NOR Flash与SD卡的选型与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:07:13

FOC从理论到实践:STM32电机控制工程细节与调试经验
FOC从理论到实践:STM32电机控制工程细节与调试经验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:07:13

I2C多主机仲裁与时钟延展:从原理到工程实践
I2C多主机仲裁与时钟延展:从原理到工程实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:06:12

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07

三菱PLC数据采集到数据库的时序设计:Python+MC协议实战
三菱PLC数据采集到数据库的时序设计:Python+MC协议实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

ASIC主模式RTL设计:状态机与三态驱动的流片级实现
ASIC主模式RTL设计:状态机与三态驱动的流片级实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

STM32嵌入式C++开发:GDB调试与Renode仿真实战指南
STM32嵌入式C++开发:GDB调试与Renode仿真实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/6 1:02:11

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:27:59

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:03

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/5 10:28:07

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码