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

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

Choyeon
Choyeon
2026年9月16日 1 分钟阅读 297 阅读
727 字 1,700 字符 更新于 2026年11月8日
算法与数据结构:动态规划 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 分钟阅读