提示:本网站现在为维护调试状态

算法與數據結構:動態規劃 5 大解題模板

Choyeon
Choyeon
2026年9月16日 1 分鐘閱讀 301 閱讀
727 字 1,700 字元 更新於 2026年11月8日
算法與數據結構:動態規劃 5 大解題模板
目錄

算法与数据结构:动态规划 5 大解题模板

动态规划是算法面试中区分度最高的题型,核心思想是把大问题拆为重叠子问题、存储中间结果避免重复计算。掌握通用五步法加五类高频模板,90%的 DP 题都能解。

通用五步法与背包类

五步:① 状态定义 dp[i][j] 含义 ② 转移方程(找最后一步两种选择)③ 初始化 base case ④ 遍历顺序 ⑤ 滚动数组空间优化。01 背包每个物品选/不选,容量倒序;完全背包物品可多次选,容量正序。

from functools import lru_cache
from typing import List
import bisect

def t1_01_knapsack(cap: int, ws: List[int], vs: List[int]) -> int:
    n = len(ws); dp = [0] * (cap + 1)
    for i in range(n):
        for c in range(cap, ws[i] - 1, -1):
            dp[c] = max(dp[c], dp[c - ws[i]] + vs[i])
    return dp[cap]

def t2_unbounded_knapsack(cap: int, ws: List[int], vs: List[int]) -> int:
    dp = [0] * (cap + 1)
    for c in range(1, cap + 1):
        for i, w in enumerate(ws):
            if w <= c: dp[c] = max(dp[c], dp[c - w] + vs[i])
    return dp[cap]

def t3_lcs(a: str, b: str) -> int:
    m, n = len(a), len(b); prev = [0] * (n + 1)
    for i in range(1, m + 1):
        cur = [0] * (n + 1)
        for j in range(1, n + 1):
            cur[j] = prev[j - 1] + 1 if a[i - 1] == b[j - 1] else max(prev[j], cur[j - 1])
        prev = cur
    return prev[n]

def t4_lis(nums: List[int]) -> int:
    tails = []
    for x in nums:
        i = bisect.bisect_left(tails, x)
        if i == len(tails): tails.append(x)
        else: tails[i] = x
    return len(tails)

def t5_interval_palindrome_cuts(s: str) -> int:
    n = len(s)
    is_pal = [[False] * n for _ in range(n)]
    for i in range(n - 1, -1, -1):
        for j in range(i, n):
            is_pal[i][j] = s[i] == s[j] and (j - i < 3 or is_pal[i + 1][j - 1])
    cut = [float('inf')] * n
    for j in range(n):
        if is_pal[0][j]: cut[j] = 0
        else:
            for i in range(1, j + 1):
                if is_pal[i][j]: cut[j] = min(cut[j], cut[i - 1] + 1)
    return int(cut[n - 1])

if __name__ == "__main__":
    print(t1_01_knapsack(10, [2, 3, 5, 7], [3, 4, 6, 10]))
    print(t3_lcs("abcde", "aceb"), t4_lis([10, 9, 2, 5, 3, 7, 101, 18]))
    print(t5_interval_palindrome_cuts("aabcbdadcb"))

子序列 / 区间 / 状压 / 树形

子序列类通常两串用二维 dp[i][j]。区间 DP 按区间长度枚举,适合回文/博弈/合并石子。状态压缩用 bitmask 表示访问过的点集(TSP)。树形 DFS 对每个子节点返回(选/不选)两状态。

DP 类型 状态定义关键词 遍历顺序 典型题
01 背包 dp[c]=容量c时最大价值 容量倒序 LC416 分割等和子集
完全背包 dp[c]=凑硬币最少个数 容量正序 LC322 零钱兑换
LIS/LCS dp[i]=以i结尾LIS长 双重i<j LC300/LC1143
区间 DP dp[i][j]=区间[i,j]最优 len从短到长 LC132 分割回文II
状压 DP dp[mask]=集合mask最优 mask从小到大 LC847 访问所有节点最短路径
树形 DP dfs(node)返回(选,不选) 后序遍历 LC337 打家劫舍III

最佳实践

写不出转移方程时先暴力搜索+记忆化,画出递归树就能看到重叠子问题的形状,再转自底向上迭代就清晰了。先过样例再空间优化。

X微博Telegram

本文作者

投票

你最希望 Rosetta 优先加入哪项功能?

社区投票(演示数据,可后台删除)

留言 (2)

0 / 3000
算法小菜鸟
算法小菜鸟2026年9月6日

作为一个刚入行的后端新人,这篇文章帮我理清了好多概念,谢谢博主持续输出高质量内容!

DevOps小能手
DevOps小能手devops-lab.cn2026年9月6日

太及时了,正好项目里要上 Redis 集群,照着来一遍省了好多事,谢谢!

相關文章

Python 併發:asyncio vs ThreadPool vs ProcessPool

Python 併發:asyncio vs ThreadPool vs ProcessPool

深度對比 Python 三大併發模型:GIL 限制下的線程池(IO 密集)、進程池(繞 GIL 適合 CPU 密集)、asyncio 協程(超高併發 IO)。從原理/性能/複雜度四維度給出選型決策樹。

1 分鐘閱讀
RAG 檢索增強生成實戰:Embedding + Vector DB + ReRank

RAG 檢索增強生成實戰:Embedding + Vector DB + ReRank

從零搭建生產級 RAG 系統:文檔分塊策略(Chunk Size/重疊窗口)、Embedding 模型選型與向量化、向量數據庫(PGVector/Milvus)檢索過濾、Reranker 重排精修 Top-K,加上引用溯源和 Prompt 壓縮優化,附完整可運行代碼。

1 分鐘閱讀
Alembic 深度指南:數據庫遷移 + 自動生成 + 分支合併

Alembic 深度指南:數據庫遷移 + 自動生成 + 分支合併

SQLAlchemy 官方遷移工具 Alembic 完全指南:從 env.py 配置、autogenerate 自動檢測模型變更(字段、索引、約束)、批處理腳本、downgrade 回滾策略,到多人併發開發時 migration 分支衝突、head 分叉合併的標準操作流程,附生產部署檢查表。

1 分鐘閱讀
快速上手 FastAPI - 構建高性能 REST API

快速上手 FastAPI - 構建高性能 REST API

FastAPI 是現代 Python Web 框架中的佼佼者,基於類型提示自動生成文檔、支持異步操作、性能媲美 Node.js。本文將通過實戰項目帶你從零構建一個完整的 CRUD API,涵蓋路由定義、請求驗證、依賴注入、數據庫集成等核心特性,讓你在 30 分鐘內掌握 FastAPI 的精髓。

這篇文章需要存取密碼 4 分鐘閱讀
Nuxt 3 進階 - SSR 與 SSG 深度解析

Nuxt 3 進階 - SSR 與 SSG 深度解析

Nuxt 3 基於 Vue 3 和 Vite 構建,帶來了全新的渲染引擎 Nitro。本文深入剖析服務端渲染(SSR)、靜態站點生成(SSG)、增量靜態再生(ISR)三種核心模式的工作原理、適用場景與性能差異。配合真實代碼演示如何配置渲染策略、優化首屏加載時間、處理緩存策略,打造極致用戶體驗。

1 分鐘閱讀
Go 語言併發:goroutine + channel + sync.WaitGroup

Go 語言併發:goroutine + channel + sync.WaitGroup

完整掌握 Go 原生併發模型:輕量級協程 goroutine(KB 級開銷)、CSP 模式 channel 通信、sync.WaitGroup 生命週期管理,加上 Context 取消、工作池模式,以及 goroutine 洩漏防護。

1 分鐘閱讀