动态规划Dynamic programming题型整理, since 2026-08-30

(2026.08.30 Sun Huizhou)
本文整理搜集网上资源中20种左右动态规划题型。

模式汇总

  1. Fibonacci Sequence
  2. Kadane's Algorithm
  3. 0/1 Knapsack
  4. Unbounded Knapsack
  5. Longest Common Subsequence (LCS)
  6. Longest Increasing Subsequence (LIS)
  7. Palindromic Subsequence
  8. Edit Distance
  9. Subset Sum
  10. String Partition
  11. Catalan Numbers
  12. Matrix Chain Multiplication
  13. Count Distinct Ways
  14. DP on Grids
  15. DP on Trees
  16. DP on Graphs
  17. Digit DP
  18. Bitmasking DP
  19. Probability DP
  20. State Machine DP

Fibonacci Sequence

F序列适用于如下情况:该问题的解决方案取决于更小实例的解决方案。该解决方案有着清晰的递归关系,描述为F序列的经典表达F(n) = F(n-1) + F(n-2)

70 爬楼梯 easy

爬楼梯需要n步到达顶端,每次爬1或2步,有多少种不同的攀登方法?
分析:设定初始条件后可通过实现F序列的公式以解决该问题。如果用经典递归方法,即更换参数调用自身,在数列变长时,会出现exceed limit的问题。该解决方案中,将中间结果保存在一个list中,最终只需要返回该序列的最后一个元素即可解决。

class Solution:
    def climbStairs(self, n: int) -> int:
        if n in (0, 1):
            return 1
        dp = [0] * (n+1)
        dp[0] = dp[1] = 1
        for i in range(2, n+1):
            dp[i] = dp[i-1] + dp[i-2]
        return dp[n]

类似的问题还有509 Fibonacci sequence,不同的是509中的初始条件不同,F(0) = 0, F(1) = 1,70中的初始条件为F(0) = F(1) = 1,注意在代码中设定初始值。

746 最低成本爬楼梯 min cost climbing easy

给定一个整数序列cost[i],代表了爬楼梯过程中,每次攀登第i个台阶,需要花费的成本,每次可以登1或2节台阶,起始点可以是index=0,也可以是index=1,计算到楼顶的最低成本。
案例1:
Input: cost = [10, 15, 20]
Output: 15
解释:从index=1开始爬,到顶的cost是15
案例2:
Input: cost = [1,100,1,1,1,100,1,1,100,1]
Output: 6
解释:从index=0开始爬
支付1,爬2级,到达index=2
支付1,爬2级,到达index=4
支付1,爬2级,到达index=6
支付1,爬2级,到达index=7
支付1,爬2级,到达index=9
支付1,爬1级,到达顶端
总cost为6

分析:该问题容易出错的地方在于,如果cost长度为n,则到达index=n-1的时候,cost已经是最后一个元素,但对答题来说到达index=n才算结束。创建一个计算总cost的序列fn,注意该序列的长度应该比cost序列的长度大1,fn的最后一个元素保存的是越过所有台阶之后到达顶端的总cost。对fn中特定元素i,该元素保存的是从i-1i-2跳到i时的最低成本,即fn(i) = min(fn[i-1]+cost[i-1], fn[i-2]+cost[i-1])fn的index=0,不需要爬任何台阶就可以到达的地方,所以fn[0]=0fn的index=1,代表直接一步到达或经过index=0的台阶到达的最小值,所有fn[1]=min(cost[1], fn[0])。使用while循环。

class Solution:
    def minCostClimbingStairs(self, cost: List[int]) -> int:
        if len(cost) < 2:
            return Exception
        fn = [0] * (len(cost) + 1)
        i = 0
        while i <= len(cost):
            if i == 0:
                fn[i] = 0
                i += 1
                continue
            elif i == 1:
                fn[i] = min(cost[i], 0)
                i += 1
                continue
            else:
                fn[i] = min(fn[i-1]+cost[i-1], fn[i-2]+cost[i-2])
                i += 1
                continue
        return fn[len(cost)]

Reference

1 20 Patterns to Master Dynamic Programming by Ashish Pratap Singh, algomaster.io

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容