week3 总结

动态规划复习

1 动态规划是什么?

讲大问题分解成子问题,对整体问题的最优解取决于子问题的最优解,一般用于解决多阶段的决策问题的最优化。

2 动态规划解决些什么?

动态规划并不是某种具体的算法,而是一种解决特定问题的方法,因此它会出现在各式各样的数据结构中,与之相关的题目种类也更为繁杂。

——OI-Wiki

2.1 简单dp

例题2.1.1 [IOI1994]数字三角形

给定一个 $r$ 行的数字三角形 $(r \leq 1000)$,需要找到一条从最高点到底部任意处结束的路径,使路径经过数字的和最大。每一步可以走到当前点左下方的点或右下方的点。

        7 
      3   8 
    8   1   0 
  2   7   4   4 
4   5   2   6   5 

在上面的例子中,最优路径是 $7 \to 3 \to 8 \to 7 \to 5$。

如果正着暴力搜索所有路径,一共 $2^r$ 条,无法接受。

但是发现最优路径其实就是每一步最优,所以对于每一个点,只有两种决策:向左下或向右下。记录最大值。

这就是 dp 的基本套路,将一个问题分解,遇到重叠的部分根据题目要求 $\max or \min$。

2.2 背包 dp

例题2.2.1 有 $n$ 个物品和一个容量为 $W$ 的背包,每个物品有重量 $w_{i}$ 和价值 $v_{i}$ 两种属性,要求选若干物品放入背包使背包中物品的总价值最大且背包中物品的总重量不超过背包的容量。

这是 0-1 背包的板子,因为每个物品只有取或不取。

设 $dp_{ij}$ 为前 $i$ 个物品在容量为 $j$ 的背包中所能达到的最大总价值。

若不放入第 $i$ 个物品,则价值不变,否则剩余容量 $-w_i$,价值 $+v_i$。

滚动 $^{[1]}$ 一下数组,得到:$$ dp_i=\max(dp_i,dp_{i-w_i}+v_i) $$

这是背包的基础公式,其他公式 $^{[2]}$ 都在上面修改而来。

$[1]$ :滚动数组是指当题目中数据量很大,但是在求解最终结果时只需要相邻的几个或几行数据时,可以使用滚动数组的思想,进行空间压缩,降维打击

$[2]$ :其他背包的公式在这里简略给出:

完全背包(每个物品无限次):$f_{i,j}=\max(f_{i-1,j},f_{i,j-w_i}+v_i)$

多重背包(第 $i$ 个物品有 $k_i$ 个):$f_{i,j}=\max_{k=0}^{k_i}(f_{i-1,j-k\times w_i}+v_i\times k)$

背包 dp 是一种变换多端的类型,也许对于一道图论题(?)拆着拆着找出了背包......

推荐:洛谷日报#61 背包问题 (附单调队列优化多重背包

2.3 区间dp

当遇到一道与区间有关的 $n\le 500$ 的求最大最小值的玄学题目,不要愣住,打好三层循环,区间 dp 莽它!

例题2.3.1 石子合并

在一个环上有 $n$ 个数 $a_1,a_2,\dots,a_n$,进行 $n-1$ 次合并操作,每次操作将相邻的两堆合并成一堆,能获得新的一堆中的石子数量的和的得分。你需要最大化你的得分。

对于环上问题,可以先运用字符串的思想破环为链

设 $dp_{i,j}$ 为合并从第 $i$ 堆到第 $j$ 堆石子的最大得分,$sum$ 为 $a$ 的前缀和。

有:

$$ dp_{i,j}=\max\{dp_{i,k}+dp_{k+1,j}+sum_j-sum_{i-1} \} $$

公式有 $i,j,k$ 三个循环变量,$O(n^3)$ 没得跑了。

基本上区间 dp 都是要三层循环的,除非毒瘤出题人要求你一定要用四边形不等式优化

附录 1

看 $n$ 猜时间复杂度/算法!

$n≤30$ 一般对应 $O(n^?)$ , dfs+剪枝,状态压缩dp

$n≤200$ 一般对应 $O(n^3)$,floyd,dp

$n≤10^3$ 一般对应 $O(n^2)O(n^2\log n)$,dp,二分

$n≤10^4$ 一般对应 $O(n \sqrt{n})$,分块

$n≤10^5$ 一般对应 $O(n\log n)$,sort,线段树、树状数组、set/map、heap、dijkstra+heap、spfa、二分

$n≤10^6$ 一般对应 $O(n)O(n\log n)$,hash、双指针扫描、kmp、AC自动机,常数比较小的 O(nlogn) 的做法:sort、树状数组、heap、dijkstra、spfa

$n≤10^7$ 一般对应 $O(n)$,双指针、kmp、线性筛素数

$n≤10^9$ 一般对应 $O(\sqrt{n})$,判断质数(这种大数用 Miller-Rabin 可能要好一点)

$n≤10^{18}$ 一般对应 $O(\log n)$,gcd

$n\le 10^{114514^{1919810}}$ 一般对应 $O(1)$。

posted @   changwenxuan  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示