跳到主要内容
极客日志极客日志
首页博客AI提示词GitHub精选代理工具
搜索
|注册
博客列表
C++算法

动态规划经典题:Unique Paths 网格路径计数详解

机器人从网格左上角出发,仅能向右或向下移动至右下角,计算不同路径总数。采用二维动态规划,定义 dp[i][j] 为到达该格子的路径数。状态转移方程为 dp[i][j] = dp[i-1][j] + dp[i][j-1]。初始化起点及边界条件。时间复杂度 O(mn),空间复杂度 O(mn),可优化至一维数组。

颠三倒四发布于 2026/3/15更新于 2026/4/2516 浏览

题目概述

在一个 m×n 的网格上,有一个机器人从左上角 (0,0) 出发,只能向右或向下移动一步。

目标是到达右下角 (m−1,n−1),要求计算一共有多少条不同的路径。

约束:1≤m,n≤100,测试数据保证答案不超过 2×10^9。

动态规划建模

状态定义:令 dp[i][j] 表示从起点 (0,0) 走到格子 (i,j) 的不同路径数量。

状态含义:每个格子只可能从上方 (i-1,j) 或左方 (i,j-1) 走到,因此到达当前格子的路径数等于来自这两个方向路径数之和。

状态初始化

起点:dp[0][0] = 1,表示机器人一开始就在这个格子上,只有 1 种方式"到达"自己。

第一行:对于 i = 0, j > 0,由于只能向右走,所以 dp[0][j] = dp[0][j - 1]。

第一列:对于 j = 0, i > 0,由于只能向下走,所以 dp[i][0] = dp[i - 1][0]。

在代码中,这些初始化逻辑是通过统一的循环和条件分支实现的,而不是单独写两层专门初始化第一行第一列:

dp[0][0] = 1;
for (i = 0; i < m; i++) {
    for (j = 0; j < n; j++) {
        if (i == 0 && j == 0) continue;
        if (i == 0) dp[i][j] = dp[i][j - 1];
        else if (j == 0) dp[i][j] = dp[i - 1][j];
        else dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
    }
}

状态转移方程

对于一般位置 (i, j) 且 i > 0, j > 0:

dp[i][j] = dp[i-1][j] + dp[i][j-1]

对于第一行:

dp[j] = dp[j-1]

对于第一列:

dp[i] = dp[i-1]

用一句话概括:到达当前格子的路径数 = 来自上方的路径数 + 来自左方的路径数。

完整实现与返回值

使用 m * n 的二维数组 dp 存储所有状态,先用 malloc 分配空间并初始化为 0。

填表顺序:外层遍历行 i,内层遍历列 j,根据上面规则更新 dp[i][j]。

最终答案是右下角格子的状态值:dp[m - 1][n - 1]。

代码中将该值保存到 result,然后释放二维数组内存,最后 return result:

result = dp[m - 1][n - 1];
 (i = ; i < m; i++) (dp[i]);
(dp);
 result;
for
0
free
free
return

复杂度与优化思路

时间复杂度:每个格子只被计算一次,共 m×n 个格子,所以是 O(mn)。

空间复杂度:使用 m * n 的二维数组存储 dp 状态,空间复杂度为 O(mn)。

优化方向:由于每次转移只依赖当前行和上一行(或当前列和上一列),可以进一步使用一维数组实现空间优化到 O(n) 或 O(m),这是常见的 follow-up。虽然当前版本使用的是二维 dp,但逻辑上已经为一维优化打下基础。

目录

  1. 题目概述
  2. 动态规划建模
  3. 状态初始化
  4. 状态转移方程
  5. 完整实现与返回值
  6. 复杂度与优化思路
  • 💰 8折买阿里云服务器限时8折了解详情
  • 💰 8折买阿里云服务器限时8折购买
  • 🦞 5分钟部署阿里云小龙虾了解详情
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Python Turtle 绘图入门与实战详解
  • 实战篇:Python 开发 MongoDB 数据库 MCP Server
  • Uncaught TypeError 空值访问报错:根源分析与根治方案
  • Python 基于 Selenium 实现淘宝购物车自动结算脚本
  • MySQL 表操作及查询
  • Flutter 集成 eth_sig_util 实现鸿蒙端以太坊签名适配
  • Mastergo AI 一键生成 HTML、Vue、React 前端代码
  • 利用 AI 自动生成符合 xxxxxl19d18–19 规范的 Python 项目结构
  • EvoCUA 刷新开源 SOTA:会操作电脑且持续进化的智能体
  • 绿联云 NAS 配置 WebDAV 实现公网同步
  • OpenClaw 框架更新:三天三版支持 GPT-5.4 与记忆热插拔
  • VSCode Copilot 文档自动化流程与配置指南
  • Stable Diffusion v1.5 广告设计实战:电商主图、社交媒体 Banner、信息图背景
  • Vue3 前端最常用的 20 道面试题总结及代码解析
  • 从零搭建 Jenkins + Docker + Gitee 自动化部署流水线
  • Java 状态机详解:三种实现方式优雅消除 if-else 嵌套
  • 无人机飞行空域申请全流程指南
  • 数据结构:二叉树与堆的结构及实现
  • LangChain 1.0 架构全景、Runnable 协议与 LCEL 声明式语法解析
  • OpenCode 使用指南:AI Skills 安装与配置教程

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online