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

动态规划实践:数字三角形问题分析

动态规划实践:数字三角形问题分析

  1. 数字三角形的动态规划分析
    按照动态规划的求解步骤,我们一步步拆解这个问题:
    1.1 最优子结构与递推方程式
    首先明确状态定义:设 dp[i][j]表示从数字三角形顶部(第0行第0列)走到第i行第j列时,路径经过的数字总和的最大值(行、列索引从0开始)。

最优子结构性质:
走到第i行第j列的最优路径,必然是从它的两个“前驱位置”(第i-1行的j-1列、第i-1行的j列)的最优路径中,选总和更大的那个,再加上当前位置的数字。

递推方程式:
dp[i][j] = max(dp[i-1][j-1], dp[i-1][j]) + triangle[i][j]

边界条件:
三角形顶部只有1个元素:dp[0][0] = triangle[0][0]
每行的边界列(避免越界):
当j=0(每行第1列):dp[i][0] = dp[i-1][0] + triangle[i][0](只能从正上方走下来)
当j=i(每行最后1列):dp[i][j] = dp[i-1][j-1] + triangle[i][j](只能从左上方走下来)

1.2 填表法的细节
表的维度:用n×n的二维数组(n是三角形的行数),第i行仅用到前i+1列(其余位置可忽略)。
填表范围:从第1行(i=1)到第n-1行,每行的列j从0到i。
填表顺序:按“行从上到下、每行从左到右”填写——因为计算第i行的dp值,仅依赖第i-1行的结果。
原问题的最优值:三角形的“底”是第n-1行,最优值是第n-1行所有dp[n-1][j](j从0到n-1)中的最大值。
比如输入样例中n=5,最后一行的dp值是24、30、27、26、24,最大值30就是最终答案。

1.3 时间与空间复杂度
时间复杂度:需要遍历每个可到达的位置(第i行有i+1个位置),总操作数为 1+2+3+…+n = \frac{n(n+1)}{2},因此时间复杂度是 O(n²)。
空间复杂度:
用二维数组存储时,空间复杂度是 O(n²);
若优化为一维数组(用当前行覆盖上一行结果),空间复杂度可降为 O(n)。

  1. 对动态规划算法的理解和体会
    做完数字三角形的分析,我对动态规划的认知更具体了:
    核心是“化繁为简+复用子解”:把“从顶到底的最大路径和”大问题,拆成“走到每个位置的最大和”小问题,且小问题的解可以复用,避免了暴力递归的“重复计算”痛点。
    “最优子结构”是前提:大问题的最优解必须能由子问题的最优解推导而来(比如数字三角形中,每个位置的最优路径依赖前驱的最优路径)。
    状态定义是“灵魂”:合理的状态定义(比如本次的dp[i][j])能自然推导出转移方程;如果状态定义不合理,后续步骤会很难推进。

不过动态规划不是万能的——得先判断问题是否满足“重叠子问题”和“最优子结构”,否则强行使用反而会绕远

http://www.jsqmd.com/news/41338/

相关文章:

  • 第4章 AI项目管理新范式:从交付功能到交付价值
  • 牛客101:链表 - 教程
  • LNCPC 2025 游寄
  • 第3章 传统项目管理在AI中的局限
  • Python 异常处理全面详解(附丰富实例)
  • IServiceCollection和IServiceProvider
  • multisim 13 Problem: Accessing the database解决办法
  • 完整教程:Redis 事务机制:Pipeline、ACID、Lua脚本
  • Python 一维数据、二维数据及 CSV 文件操作全解析(附实例)
  • 银行核心账户体系、账务设计、会计核心(整合版)
  • 斐波那契数列相关恒等式
  • Python 文件操作全面详解:从基础到进阶(附丰富实例)
  • 银行中外汇的由来(金融产品经理必读)
  • AI元人文框架:意义世界的探索引擎
  • abc432
  • 20232310 2025-2026-1 《网络与系统攻防技术》实验五实验报告
  • 实用指南:开源 Linux 服务器与中间件(七)数据库--MySQL
  • 版本控制与GitLab完整实践指南 - 指南
  • 利用Myo臂环采集肌电信号和角速度来建立实时手势识别
  • [MySQL] 基础操控
  • 公告栏
  • 做题笔记25
  • 云服务器部署Python后端偶遇`ImportError`: 从依赖版本到Python升级的排错全攻略 - 实践
  • 生物化学课程笔记
  • 20251115 - Hash
  • apache和nginx解析php和lnmp和lamp搭建
  • hippy字节都在用的前端主流框架
  • springboot多模块报错分析(一) - f
  • 身为大厂前端的你,不能不知道Babel + Polyfill!
  • 跨域问题解决方案汇总