本文档提供了 LeetCode 仓库中动态规划问题解决方法的技术概述。动态规划 (DP) 是一种强大的算法技术,通过将复杂问题分解为简单的重叠子问题并存储它们的解以避免冗余计算来解决复杂问题。
有关动态规划作为概念的通用信息,请参阅 算法。有关在数组问题或树/图问题中的具体应用,请分别参阅 数组问题 和 树和图问题。
动态规划解决方案通常涉及以下关键组成部分:
来源: problems/62.unique-paths.md60-98 problems/53.maximum-sum-subarray-cn.md110-136 problems/416.partition-equal-subset-sum.md142-180
仓库中的动态规划问题可以分为几种模式:
来源: problems/62.unique-paths.md60-70 problems/53.maximum-sum-subarray-cn.md37-110 problems/416.partition-equal-subset-sum.md47-52 problems/139.word-break.md44-60
状态定义和转移方程是任何动态规划解决方案的核心。以下是仓库中的常见模式示例:
对于“最大子数组”等问题:
来源: problems/53.maximum-sum-subarray-cn.md110-136
对于像“Unique Paths”这样的基于网格的问题:
来源: problems/62.unique-paths.md60-98 problems/63.unique-paths-ii.md52-70
自下而上的方法从基本情况开始迭代地构建解决方案。
来源: problems/62.unique-paths.md129-152
自顶向下的方法使用带缓存(记忆化)的递归。
来源: problems/62.unique-paths.md106-114
许多 DP 解决方案可以优化以使用更少的内存。常见技术包括:
将二维 DP 数组解决方案转换为一维。
来源: problems/62.unique-paths.md94-98 problems/416.partition-equal-subset-sum.md209-245
“Unique Paths”示例
来源: problems/62.unique-paths.md157-166
对于某些问题,我们可以进一步优化,只使用常数个变量。
来源: problems/53.maximum-sum-subarray-cn.md379-387
“Unique Paths”和“Unique Paths with Obstacles”等基于网格的问题遵循一致的模式。
来源: problems/62.unique-paths.md60-70 problems/63.unique-paths-ii.md52-70
涉及划分或子集选择的问题通常使用背包模式的变体。
来源: problems/416.partition-equal-subset-sum.md142-180
字符串上的动态规划需要不同的状态定义。
来源: problems/139.word-break.md60-95
在处理 DP 问题时,请遵循以下步骤:
确定 DP 是否适用:
定义状态:
制定基本情况:
开发状态转移方程:
确定计算顺序:
实现和优化:
来源: problems/62.unique-paths.md60-98 problems/53.maximum-sum-subarray-cn.md110-136 problems/416.partition-equal-subset-sum.md142-180
动态规划经常与其他算法技术交叉。
来源: problems/416.partition-equal-subset-sum.md246-295 problems/139.word-break.md44-95
来源: problems/62.unique-paths.md116-122 problems/416.partition-equal-subset-sum.md209-245
要练习更多动态规划模式,请探索这些相关问题:
来源: problems/53.maximum-sum-subarray-cn.md410-414 problems/62.unique-paths.md195-199