dp部分专练总结

dp部分专练总结

一、背包问题

1. 0-1背包问题

所有背包问题的基础模板。

问题描述如下:有 $n$ 个物品,每个物品有 $w$ 重量与 $v$ 价格两个属性。在背包容量(能承载的总重量)有限的情况下,求能获得的最大价值之和。

设 $f_{i,j}$ 为在考虑完钱 $i$ 个物品时容量为 $j$ 的背包的最大价值。

易得转移方程 $f_{i,j}=\max (f_{i-1,j},f_{i-1,j-w_i}+v_i)$ 。

由于对 $f_i$ 有影响的只有 $f_{i-1}$,可以去掉第一位,直接以 $f_i$ 表示容量为 $i$ 时的最大价值。

即 $f_i=max(f_j,f_{j-w_i}+v_i)$ 。

2. 完全背包问题

与 0-1 背包的区别为:每个物品可以选取无限次。

可在 0-1 背包转移方程的基础上加一个系数 $k$ ,范围为 $[0,\inf]$ 。

得朴素转移方程 $f_{i,j}=\max\limits^\inf_{k=0}(f_{i-1,j-w_i\times k}+v_i\times k)$ 。

可以发现,对于 $f_{i,j}$ ,可以通过 $f_{i,j-w_i}$ 转移。

可将转移方程优化为 $f_{i,j}=\max(f_{i-1,j},f_{i,j-w_i}+v_i)$ 。

3. 多重背包问题

与 0-1 背包的区别为:每个物品的数量有限,为 $k_i$ 。

显然可以将问题 “有 $k_i$ 个同样的物品” 转换为 0-1 背包问题。

转移方程略。$\color{white}其实是懒$

4. 混合背包问题

指在一个问题中出现了 0-1,完全,多重三种背包。

直接上伪代码 (选自 oi-wiki):

for (循环物品种类) {
  if (0 - 1 背包)
    套用 0 - 1 背包代码;
  else if (是完全背包)
    套用完全背包代码;
  else if (是多重背包)
    套用多重背包代码;
}

5. 分组背包问题

不会

二、序列dp问题

1.最长公共子序列 (LCS)

给定两个序列 $A,B$,求取最长序列 $F$,使得 $F$ 是 $A,B$ 的子序列。(即被 $A,B$ 完整包含,可以不连续)

设 $f_{i,j}$ 是考虑 $A$ 的前 $i$ 个元素,$B$ 的前 $j$ 个元素。

对于每个 $f_{i,j}$ ,存在三种决策:

  • 若 $A_i=B_j$ ,则可以将其接至 $F$ 末尾;
  • 跳过 $A_i$ ;
  • 跳过 $B_i$ 。

即 $f_{i,j}=\left\{\begin{aligned}f_{i-1,j-1}+1&&A_i=B_j\\\max(f_{i-1,j},f_{,j-1})&&A_i\neq B_j\end{aligned}\right.$

2. 最长上升子序列 (LIS)

设 $f_i$ 为序列 $A$ 中

显然,转移方程为 $f_i=\max(0,f_j \or i>j,a_i>a_j)+1$ 。

posted @   CQWDX  阅读(5)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示