菜单

动态规划

相关源文件

本文档涵盖了仓库中的动态规划算法和实现,包括经典的优化问题、序列处理算法和高级应用。对于使用类似优化原则的图算法,请参阅图算法与网络分析。对于不使用动态规划的字符串处理算法,请参阅字符串处理与模式匹配

核心概念与实现模式

动态规划通过将优化问题分解为重叠子问题并存储结果以避免重复计算来解决问题。该仓库在各种问题领域实现了记忆化(自顶向下)和递推(自底向上)两种方法。

基础动态规划方法

来源:dynamic_programming/rod_cutting.py14-174 dynamic_programming/combination_sum_iv.py45-72

问题分类矩阵

问题类型经典示例空间复杂度优化技术
线性动态规划longest_increasing_subsequence(), max_product_subarray()O(n)滚动变量法
二维网格动态规划longest_common_subsequence(), knapsack()O(m×n)行空间优化
区间动态规划matrix_chain_multiply()O(n²)对角线填充
字符串动态规划all_construct(), dp_match()O(m×n)模式优化

来源:dynamic_programming/longest_increasing_subsequence.py19-61 dynamic_programming/longest_common_subsequence.py9-82 dynamic_programming/matrix_chain_multiplication.py54-96

经典优化问题

背包问题变体

该仓库提供了具有不同优化目标的全面背包问题实现。

来源:dynamic_programming/knapsack.py29-39 dynamic_programming/knapsack.py10-26 dynamic_programming/knapsack.py42-100

序列处理算法

最长公共子序列 (LCS)

longest_common_subsequence()函数实现了经典的字符串比对算法,包括长度计算和序列重构。

  • 动态规划递推关系: dp[i][j] = max(dp[i-1][j], dp[i][j-1], dp[i-1][j-1] + match)
  • 空间复杂度: O(m×n) 用于动态规划表
  • 输出: 返回长度和实际的子序列字符串

来源:dynamic_programming/longest_common_subsequence.py59-82

最长递增子序列 (LIS)

两种实现提供了不同的时间复杂度权衡。

实现时间复杂度空间复杂度算法
longest_subsequence()O(2^n)O(n)带有剪枝的递归
longest_increasing_subsequence_length()O(n log n)O(n)二分查找优化

来源:dynamic_programming/longest_increasing_subsequence.py19-61 dynamic_programming/longest_increasing_subsequence_o_nlogn.py20-49

高级动态规划应用

矩阵链乘法

matrix_chain_multiply()函数解决了最优括号化问题。

来源:dynamic_programming/matrix_chain_multiplication.py86-94

隐马尔可夫模型的维特比算法

viterbi()函数实现了最可能状态序列算法。

  • 输入: observations_space, states_space, 概率字典
  • 核心逻辑: 基于状态转移的动态规划
  • 输出: 给定观测值下最可能的状态序列

来源:dynamic_programming/viterbi.py4-176

动态规划在字符串处理中的应用

模式匹配与构造

正则表达式匹配

dp_match()函数提供了 O(m×n) 的正则表达式匹配,支持.(任意字符)和*(零个或多个)操作符。

来源:dynamic_programming/regex_match.py82-89

字符串构造问题

all_construct()函数找到从词库构造目标字符串的所有方式。

  • 表格结构: table[i]包含构造target[:i]的所有方式
  • 组合生成: [word, *way] for way in table[i]
  • 结果: 所有可能的构造(倒序)

来源:dynamic_programming/all_construct.py22-48

性能优化技巧

空间复杂度优化

许多二维动态规划问题可以优化为使用 O(min(m,n)) 空间。

算法原始空间优化空间技术
LCSO(m×n)O(min(m,n))双行技术
背包问题O(n×W)O(W)滚动数组
LISO(n²)O(n)二分查找

时间复杂度分析

来源:dynamic_programming/rod_cutting.py14-53 dynamic_programming/longest_increasing_subsequence_o_nlogn.py20-49

与数据结构的集成

线段树与范围查询

虽然并非严格意义上的动态规划,但线段树具有相似的递归分解原理,并用于动态规划的优化。

  • 构建阶段: build(1, 0, N-1)自底向上构建树
  • 查询优化: O(log n) 时间内的范围最大值查询
  • 动态规划应用: 用于区间动态规划问题,实现高效的范围查询。

来源:data_structures/binary_tree/segment_tree.py38-97 data_structures/binary_tree/non_recursive_segment_tree.py47-116

高级字符串算法

马拉车算法(Manacher's algorithm)用于回文检测,展示了类似动态规划的优化。

  • 核心思想: k = min(length[left + right - j] // 2, right - j + 1)
  • 时间复杂度: O(n) 线性时间回文检测
  • 应用: 用于需要回文查询的字符串动态规划问题。

来源:strings/manacher.py40-48