动态规划 笔记

思维题

CF1517D Explorer Space

显然 k k k 必须为偶数。

设走的来回由路径 x x x y y y 组成。若 x < y x<y x<y,则我们可以将 x x x 反转方向代替 y y y,取得更优秀的解,转化为求以某点为起点出发求走 ⌊ p 2 ⌋ \lfloor\frac{p}{2}\rfloor 2p 步的最短路径 。

考虑反向,求解以某点为终点走 ⌊ p 2 ⌋ \lfloor\frac{p}{2}\rfloor 2p 步的最短路径, f i , j , k f_{i,j,k} fi,j,k 可由上下左右四个位置的格子转移而来。

UVA1638 杆子的排列 Pole Arrangement

f i , j , k f_{i,j,k} fi,j,k 为放了 i i i 根,从左看到 j j j 根 ,从右看到 k k k 根,的方案数。

考虑每次插入一根最小的杆子,分析插入的位置。

f i , j , k = f i − 1 , j − 1 , k + f i − 1 , j , k − 1 + ( i − 2 ) × f i − 1 , j − 1 , k − 1 f_{i,j,k}=f_{i-1,j-1,k}+f_{i-1,j,k-1}+(i-2)\times f_{i-1,j-1,k-1} fi,j,k=fi1,j1,k+fi1,j,k1+(i2)×fi1,j1,k1

dp 考虑按大小插入。

线性动态规划

最大子段和

考虑dp, f i = max ⁡ { f i − 1 + a i , a i } f_i=\max\{f_{i-1}+a_i,a_i\} fi=max{fi1+ai,ai}

或考虑定义 max ⁡ { s i − s k , k ∈ [ 1 , i ] } \max\{s_i-s_k,k\in[1,i]\} max{sisk,k[1,i]},维护 s k s_k sk 最小值。

  • 长度限制,不超过 m m m ,则 k ∈ [ i − m , i ] k\in[i-m,i] k[im,i],至少为 m m m ,则 k ∈ [ 0 , i − m ] k\in[0,i-m] k[0,im]

  • 环状,断环成链,做长度不超过 m m m 的最大子段和。

  • 多段,考虑 f i , j , 0 / 1 f_{i,j,0/1} fi,j,0/1 表示前 i i i 个分 j j j 段第 i i i 个选不选的最大子段和,可以相邻 { f i , j , 0 = max ⁡ { f i − 1 , j − 1 , 1 , f i − 1 , j , 0 } f i , j , 1 = max ⁡ { f i − 1 , j , 1 , f i − 1 , j − 1 , 1 , f i − 1 , j − 1 , 0 } + a i \begin{cases}f_{i,j,0}=\max\{f_{i-1,j-1,1},f_{i-1,j,0}\}\\f_{i,j,1}=\max\{f_{i-1,j,1},f_{i-1,j-1,1},f_{i-1,j-1,0}\}+a_i\end{cases} {fi,j,0=max{fi1,j1,1,fi1,j,0}fi,j,1=max{fi1,j,1,fi1,j1,1,fi1,j1,0}+ai不可以相邻 { f i , j , 0 = max ⁡ { f i − 1 , j − 1 , 1 , f i − 1 , j , 0 } f i , j , 1 = max ⁡ { f i − 1 , j , 1 , f i − 1 , j − 1 , 0 } + a i \begin{cases}f_{i,j,0}=\max\{f_{i-1,j-1,1},f_{i-1,j,0}\}\\f_{i,j,1}=\max\{f_{i-1,j,1},f_{i-1,j-1,0}\}+a_i\end{cases} {fi,j,0=max{fi1,j1,1,fi1,j,0}fi,j,1=max{fi1,j,1,fi1,j1,0}+ai

  • 上下限,不含负数,尺取法即可。

  • 上下限,含负数,将前缀和离散化,即最小化 j − i j-i ji,满足 s j − s i > = S s_j-s_i>=S sjsi>=S,枚举 j j j,查询不大于 s j − S s_j-S sjS 最大的 s i s_i si 即可,用数据结构维护。

  • 环状两段,不跨越 n → 1 n\rightarrow 1 n1,最大两段和,跨越 n → 1 n\rightarrow 1 n1,总和 − - 不跨越的最小不相邻两段和。

洛谷P1521 求逆序对

考虑在 n − 1 n-1 n1 的排列中插入 n n n,能新增的逆序对数 ∈ [ 0 , n − 1 ] \in[0,n-1] [0,n1],设 f i , j f_{i,j} fi,j 表示长 i i i 的序列,逆序对数为 j j j 的方案数, g i , j = ∑ k = 1 j f i , k g_{i,j}=\sum_{k=1}^{j}f_{i,k} gi,j=k=1jfi,k
f i , j = ∑ k = j − i + 1 j f i − 1 , k = g i − 1 , j − g i − 1 , j − i f_{i,j}=\sum_{k=j-i+1}^{j}f_{i-1,k}=g_{i-1,j}-g_{i-1,j-i} fi,j=k=ji+1jfi1,k=gi1,jgi1,ji

洛谷P3131 Subsequences Summing to Sevens S

1 . 设 f i , j f_{i,j} fi,j 为满足 a i   m o d   7 = j a_i \bmod 7=j aimod7=j 的最大区间长度。
对于每一个 f i , j f_{i,j} fi,j 均只有两种情况:接着上一段,新开一段。
f i , j = { f i − 1 , j − a i + 1 , f i − 1 , j > 0 1 , ∀ f i − 1 , k = 0 , k ∈ [ 0 , 6 ] f_{i,j}=\begin{cases}f_{i-1,j-a_i}+1 ,f_{i-1,j}>0\\ 1,\forall f_{i-1,k}=0, k \in [0,6] \end{cases} fi,j={fi1,jai+1,fi1,j>01,fi1,k=0,k[0,6]新开一段与接着上一个区间并不是并列关系,不能同时新开和接上一段,仅当没有任何一个 a i a_i ai 满足条件时才新开一段。

答案为 a n s = max ⁡ { f i , 0 ∣ i ∈ [ 1 , n ] } ans=\max\{f_{i,0}|i \in[1,n]\} ans=max{fi,0i[1,n]}
    \space \\\space   
2 . 记 p r e i = ∑ j = 1 i a j pre_i=\sum_{j=1}^{i}a_j prei=j=1iaj s u m i , j = p r e j − p r e i − 1 sum_{i,j}=pre_j-pre_{i-1} sumi,j=prejprei1

由题 s u m i , j   m o d   7 = 0 ∴ ( p r e j − p r e i − 1 )   m o d   7 = 0 ∴ p r e j ≡ p r e i − 1 ( m o d 7 ) sum_{i,j}\bmod 7=0\\\therefore (pre_j-pre_{i-1})\bmod 7=0\\\therefore pre_j \equiv pre_{i-1}\pmod 7 sumi,jmod7=0(prejprei1)mod7=0prejprei1(mod7)

记录每个 p r e i   m o d   7 pre_i \bmod 7 preimod7 所得各余数出现的最大和最小下标,枚举每个余数即可。
a n s = max ⁡ { j − i + 1   ∣   p r e j ≡ p r e i ( m o d 7 ) } ans=\max\{j-i+1\space |\space pre_j\equiv pre_i\pmod7\} ans=max{ji+1  prejprei(mod7)}

    \space \\\space   

洛谷P1353 Running S

1 . 设 f i , j f_{i,j} fi,j 表示时刻 i i i 疲劳度为 j j j 可跑的最大距离。

f i , j = max ⁡ { f i − 1 , j − 1 + d i } f i , 0 = max ⁡ { f i − j , 0 , f i − j , 1 , ⋯   , f i − j , j − 1 , f i − j , j   ∣   i − j ≥ 0 } f_{i,j}=\max\{f_{i-1,j-1}+d_{i}\}\\f_{i,0}=\max\{f_{i-j,0},f_{i-j,1},\cdots,f_{i-j,j-1},f_{i-j,j}\space |\space i-j\geq0\} fi,j=max{fi1,j1+di}fi,0=max{fij,0,fij,1,,fij,j1,fij,j  ij0}
动态维护 f i − j , 0 , f i − j , 1 , ⋯   , f i − j , j − 1 , f i − j , j f_{i-j,0},f_{i-j,1},\cdots,f_{i-j,j-1},f_{i-j,j} fij,0,fij,1,,fij,j1,fij,j 的最小值即可。

2 . 设 f i , j , 0 / 1 f_{i,j,0/1} fi,j,0/1 表示 i i i 时刻疲劳度为 j j j 能走的最大距离,是否在跑步。 f i , 1 , 1 = f i − 1 , 0 , 0 + d i f i , j , 1 = f i − 1 , j − 1 , 1 , j > 1 f i , 0 , 0 = max ⁡ { f i − 1 , 1 , 0 , f i − 1 , 1 , 1 , f i − 1 , 0 , 0 } f i , j , 0 = max ⁡ { f i − 1 , j + 1 , 0 , , f i − 1 , j + 1 , 1 } , j > 1 f_{i,1,1}=f_{i-1,0,0}+d_{i}\\f_{i,j,1}=f_{i-1,j-1,1},j>1\\f_{i,0,0}=\max\{f_{i-1,1,0},f_{i-1,1,1},f_{i-1,0,0}\}\\f_{i,j,0}=\max\{f_{i-1,j+1,0,},f_{i-1,j+1,1}\},j>1 fi,1,1=fi1,0,0+difi,j,1=fi1,j1,1,j>1fi,0,0=max{fi1,1,0,fi1,1,1,fi1,0,0}fi,j,0=max{fi1,j+1,0,,fi1,j+1,1},j>1
3.将跑步和休息作为整体 dp。

CF1392D Omkar and Bed Wars

考虑一个合法的串,必然不含有超过 3 3 3 个连续的 L L L R R R,考虑断成首尾不同的链,答案即为每个连续段的长度 ⌊ l e n 3 ⌋ \lfloor\frac{len}{3}\rfloor 3len,特判全为 L L L R R R 时答案为 ⌊ n + 2 3 ⌋ \lfloor\frac{n+2}{3}\rfloor 3n+2

考虑 dp , f i , j , k , l , m f_{i,j,k,l,m} fi,j,k,l,m 为第 i i i 位箭头为 j j j, 第 i − 1 i-1 i1 位箭头为 k k k ,首位为 l l l,第二位为 m m m 的最小修改次数,枚举合法状态转移即可,特判前 2 2 2 个和第 n n n 个。

考虑 dp ,合法箭头 L R , L L R , L R R , L L R R LR,LLR,LRR,LLRR LR,LLR,LRR,LLRR,dp 即可。

洛谷P1133 教主的花园

1. f i , j , k , l f_{i,j,k,l} fi,j,k,l 表示种到第 i i i 棵树,本棵树高度为 j j j ,上一颗树高度为 k k k,其所使用的第一棵树的高度为 l l l
f i , j , k , a = max ⁡ { f i − 1 , k , l , a + v i , j   ∣   j < k > l or ⁡ j > k < l } f_{i,j,k,a}=\max\{f_{i-1,k,l,a}+v_{i,j}\space | \space j<k>l \operatorname{or} j>k<l\} fi,j,k,a=max{fi1,k,l,a+vi,j  j<k>lorj>k<l}特判前几个和最后一个即可。

2.设 f i , j , k f_{i,j,k} fi,j,k 表示种到 i i i 棵树,第 i i i 棵树高度为 j j j k = 1 k=1 k=1 表示比相邻高, k = 0 k=0 k=0 表示比相邻低。 f i , 1 , 0 = max ⁡ { f i − 1 , 2 , 1 , f i − 1 , 3 , 1 } + v i , 1 f i , 2 , 0 = f i − 1 , 3 , 1 + v i , 2 f i , 2 , 1 = f i − 1 , 1 , 0 + v i , 2 f i , 3 , 1 = max ⁡ { f i − 1 , 2 , 0 , f i − 1 , 1 , 0 } + v i , 3 f_{i,1,0}=\max\{f_{i-1,2,1},f_{i-1,3,1}\}+v_{i,1}\\ f_{i,2,0}=f_{i-1,3,1}+v_{i,2}\\ f_{i,2,1}=f_{i-1,1,0}+v_{i,2}\\ f_{i,3,1}=\max\{f_{i-1,2,0},f_{i-1,1,0}\}+v_{i,3} fi,1,0=max{fi1,2,1,fi1,3,1}+vi,1fi,2,0=fi1,3,1+vi,2fi,2,1=fi1,1,0+vi,2fi,3,1=max{fi1,2,0,fi1,1,0}+vi,3特判前几个和最后一个即可。

洛谷P1280 尼克的任务

f i f_i fi 表示 i i i 时刻能获得的最大空闲时间,发现 f i f_i fi 与之后任务的选择是有关系的不满足无后效性。

于是我们将时间倒着遍历(还有考虑结束时间,都是时间问题常用手段),就不会影响到了。将任务按开始时间排个序方便处理。

如果时刻 i i i 无任务, f i = f i + 1 + 1 f_{i}=f_{i+1}+1 fi=fi+1+1
如果时刻 i i i 有任务 x x x t x t_x tx 表示该任务结束时间, f i = max ⁡ { f t x + 1 } f_{i}=\max\{f_{t_x+1}\} fi=max{ftx+1},注意可能有多个任务,取最大值即可。

字符串

洛谷P2758 编辑距离

首先 A 删除可看成 B 添加,效果是一样的。

f i , j f_{i,j} fi,j 表示使 A 前 i i i 个变为 B前 j j j所需要的最小次数。

A i A_i Ai 等于 B j B_j Bj 时,考虑继承 f i − 1 , . j − 1 f_{i-1,.j-1} fi1,.j1
否则考虑删除 A , f i − 1 , j + 1 f_{i-1,j}+1 fi1,j+1,删除 B, f i , j − 1 + 1 f_{i,j-1}+1 fi,j1+1 ,改变使得此时 A , B 末尾字符相同, f i − 1 , j − 1 + 1 f_{i-1,j-1}+1 fi1,j1+1。顺着定理理解。

初始化 ∀ i , f i , 0 = f 0 , i = i \forall i,f_{i,0}=f_{0,i}=i i,fi,0=f0,i=i
f i , j = { f i − 1 , j − 1 , A i = B j min ⁡ { f i − 1 , j + 1 , f i , j − 1 + 1 , f i − 1 , j − 1 + 1 } , A i ≠ B j f_{i,j}=\begin{cases} f_{i-1,j-1},A_i=B_j\\ \min\{f_{i-1,j}+1,f_{i,j-1}+1,f_{i-1,j-1}+1\}, A_i\not =B_j\end{cases} fi,j={fi1,j1,Ai=Bjmin{fi1,j+1,fi,j1+1,fi1,j1+1},Ai=Bj

洛谷P1279 字串距离

跟上面一题很相似,也只有两种操作,即按原序列匹配,或插入分隔符。两分隔符相邻贡献为 0 必然不会是最优解,不考虑。

f i , j f_{i,j} fi,j 表示 A 前 i i i 个,B 前 j j j 个的最小距离,分隔符与其他字符的距离为 k k k

初始化 ∀ i , f i , 0 = i × k , f 0 , i = i × k \forall i,f_{i,0}=i\times k ,f_{0,i}=i \times k i,fi,0=i×k,f0,i=i×k
f i , j = min ⁡ { f i − 1 , j − 1 + ∣ A i − B j ∣ , f i − 1 , j + k , f i , j − 1 + k } f_{i,j}=\min\{f_{i-1,j-1}+\lvert A_i-B_j\rvert,f_{i-1,j}+k,f_{i,j-1}+k\} fi,j=min{fi1,j1+AiBj,fi1,j+k,fi,j1+k}

洛谷P4059 找爸爸

跟上面一题很相似,即按原序列匹配,或插入空格。

对于按原序列匹配的情况同上题。

对于空格字符的处理,一段长为 k k k 的空格造成 g ( k ) = − x − y ( k − 1 ) g(k)=−x−y(k−1) g(k)=xy(k1) 的贡献,考虑递推式

g ( 1 ) = − x g(1)=-x g(1)=x g ( k ) = g ( k − 1 ) − y g(k)=g(k-1)-y g(k)=g(k1)y

分别考虑接着上一段空格和新开一段的贡献,发现不好状态转移时判断末尾字符是否是空格,于是果断加一维表示哪个字符串的末尾为空格。

f i , j , k f_{i,j,k} fi,j,k 表示 A 前 i i i 个和 B 前 j j j 个的最大相似程度,当 k = 0 k=0 k=0 时 A,B 末尾均不为空格,当 k = 1 k=1 k=1 时 A 末尾为空格,当 k = 2 k=2 k=2 时 B 末尾为空格,都为空格的情况贡献为 0 ,故不考虑。

初始化 ∀ i , f i , 0 , 1 = f 0 , i , 2 = g ( i ) \forall i,f_{i,0,1}=f_{0,i,2}=g(i) i,fi,0,1=f0,i,2=g(i)

f i , j , 0 = max ⁡ { f i − 1 , j − 1 , 0 ,   f i − 1 , j − 1 , 1 ,   f i − 1 , j − 1 , 2 } + d A i , B j f i , j , 1 = max ⁡ { f i − 1 , j , 0 − x ,   f i − 1 , j , 2 − x ,   f i − 1 , j , 1 − y } f i , j , 2 = max ⁡ { f i , j − 1 , 0 − x ,   f i , j − 1 , 1 − x ,   f i , j − 1 , 1 − y } f_{i,j,0}=\max\{f_{i-1,j-1,0},\space f_{i-1,j-1,1}, \space f_{i-1,j-1,2}\}+d_{A_i,B_j}\\ f_{i,j,1}=\max\{f_{i-1,j,0}-x,\space f_{i-1,j,2}-x,\space f_{i-1,j,1}-y\}\\ f_{i,j,2}=\max\{f_{i,j-1,0}-x,\space f_{i,j-1,1}-x,\space f_{i,j-1,1}-y\} fi,j,0=max{fi1,j1,0, fi1,j1,1, fi1,j1,2}+dAi,Bjfi,j,1=max{fi1,j,0x, fi1,j,2x, fi1,j,1y}fi,j,2=max{fi,j1,0x, fi,j1,1x, fi,j1,1y}

严格的将上次状态,这次状态相对于上一个状态改变的部分区分开来(即本次状态需要修改的部分),才能保证不遗漏也不重复。

树形动态规划

P2458 [SDOI2006]保安站岗

P2899 [USACO08JAN]Cell Phone Network G

不同于 P2016 战略游戏 覆盖所有的边,本题为覆盖所有点。

f i , 0 / 1 / 2 f_{i,0/1/2} fi,0/1/2 表示 i i i 点自己覆盖,被子结点覆盖,被父亲节点覆盖的最小代价。

{ f u , 0 = c u + ∑ v min ⁡ { f v , 0 , f v , 1 , f v , 2 } f u , 1 = min ⁡ { f v , 0 − f v , 1 } [   ∀ v , f v , 1 < f v , 0 ] + ∑ v min ⁡ { f v , 0 , f v , 1 } f u , 2 = min ⁡ { f v , 0 , f v , 1 } \begin{cases}f_{u,0}=c_u+\sum_{v}\min\{f_{v,0},f_{v,1},f_{v,2}\}\\ f_{u,1}=\min\{f_{v,0}-f_{v,1}\}[\space \forall v,f_{v,1}<f_{v,0} ]+\sum_{v}\min\{f_{v,0},f_{v,1}\}\\ f_{u,2}=\min\{f_{v,0},f_{v,1}\}\end{cases} fu,0=cu+vmin{fv,0,fv,1,fv,2}fu,1=min{fv,0fv,1}[ v,fv,1<fv,0]+vmin{fv,0,fv,1}fu,2=min{fv,0,fv,1}

P3177 [HAOI2015]树上染色

树上背包,某一维为当前遍历到第几个子树,相当于物品种类,一般滚掉,表示容量的那一维一般倒序遍历。

考虑每条边被覆盖的次数,转变为树上背包, f u , i f_{u,i} fu,i u u u 子树内选择 i i i 个黑点的最大值。

f u , i = max ⁡ { f u , k − j + f v , j + [ ( s z v − j ) × ( n − k − s z v + j ) + j × ( k − j ) ] × w u , v , j ≤ min ⁡ { k , s z u } } f_{u,i}=\max\{f_{u,k-j}+f_{v,j}+[(sz_v-j)\times(n-k-sz_v+j)+j\times(k-j)]\times w_{u,v},j\leq \min\{k,sz_u\}\} fu,i=max{fu,kj+fv,j+[(szvj)×(nkszv+j)+j×(kj)]×wu,v,jmin{k,szu}}

注意 f u , j − k f_{u,j-k} fu,jk 可能没有意义,因为已经更新的子树的 ∑ s z \sum sz sz 小于 j − k j-k jk

CF461B Appleman and Tree

f u , 0 / 1 f_{u,0/1} fu,0/1 表示 u u u 的子树内是否有一个黑点的答案。

f u , 1 = f u , 1 × ( f v , 1 + f v , 0 ) + f u , 0 × f v , 1 f u , 0 = f u , 0 × ( f v , 1 + f v , 0 ) f_{u,1}=f_{u,1}\times(f_{v,1}+f_{v,0})+f_{u,0}\times f_{v,1}\\f_{u,0}=f_{u,0}\times(f_{v,1}+f_{v,0}) fu,1=fu,1×(fv,1+fv,0)+fu,0×fv,1fu,0=fu,0×(fv,1+fv,0)

P2515 [HAOI2010]软件安装

换根 dp

P3047 [USACO12FEB]Nearby Cows G

求出每个点答案,必然考虑换根。

预处理出到每个点向上和向下距离为 k k k 的点权值和,分别记为 f u , i , g u , i f_{u,i},g_{u,i} fu,i,gu,i { f u , 0 = w u f u , i = ∑ f v , i − 1 { g u , 1 = w p r t u g u , i = g p r t u , i − 1 + f p r t u , i − 1 − f u , i − 2 \begin{cases}f_{u,0}=w_u \\f_{u,i}=\sum f_{v,i-1}\end{cases}\\\begin{cases}g_{u,1}=w_{prt_u}\\g_{u,i}=g_{prt_u,i-1}+f_{prt_u,i-1}-f_{u,i-2}\end{cases} {fu,0=wufu,i=fv,i1{gu,1=wprtugu,i=gprtu,i1+fprtu,i1fu,i2换根时 c u r ← c u r − f u , k + f v , k − 1 − g u , k + f v , k cur\leftarrow cur-f_{u,k}+f_{v,k-1}-g_{u,k}+f_{v,k} curcurfu,k+fv,k1gu,k+fv,k

背包动态规划

洛谷P1504 Cow Exhibition G

构造背包模型,对于每一头奶牛仅有选与不选两种情况,对于智商与情商,考虑任意取一个作为容量,另一个做价值。

注:对于负数(搞不懂情商智商怎么还有负的)可使用
1.数组整体偏移。
偏移整体的下标(每一次的访问均需要偏移,偏移量相同)。
偏移数组的指针 ( f ′ = f + Δ f'=f+\Delta f=f+Δ)。
2.map ,哈希。
注:对于含负数的情况,赋初值时(极)有可能不能赋值为 0。
注:对于含有负数的价值,不能同正数一起处理,只需分开处理修改各自的循环范围即可,正数 01 背包倒序,完全背包正序,负数相反。

洛谷P1504 垃圾陷阱

构造背包模型,对于每一只垃圾,有且仅有两种操作,堆放或者吃掉,将高度作为容量,总存活时间作为价值,不考虑将剩余存活时间作为价值。

检查能否取到某个物品,需将物品按时间排序,判断能否存活到该物品的掉落时间( t j t_j tj)。

f i f_{i} fi 表示垃圾高度为 i i i 时最多能存活多久。

注:注意添加可行性判断 f i ≥ t j f_{i} \ge t_j fitj
注:该题状态 f i f_i fi 不具有单调性,即 for 循环中终止条件不可加入(部分)可行性判断,如 f i ≥ t j f_{i} \ge t_j fitj

洛谷P1176 宝物筛选

多重背包二进制优化模板题。

考虑二进制优化, c i c_i ci 为第 i i i 件物品可选的个数,考虑将 c i c_i ci 拆解成 1 , 2 , 4 , 8 , ⋯   , 2 k , c i − 2 k 1,2,4,8,\cdots,2^k,c_i-2^k 1,2,4,8,,2k,ci2k k k k 为满足 c i ≥ 2 k c_i \ge 2^k ci2k的最大正整数,从而使得 1 ∼ c i 1\sim c_i 1ci 中的每一个数都能被其中的数表示出来,然后进行 01 背包即可。

考虑单调队列优化,然而我不会

洛谷P5365 英雄联盟

构造背包模型,对于每个英雄,其皮肤可选 0 ∼ c i 0\sim c_i 0ci 种,考虑将皮肤数量作为容量,展示策略个数作为价值。

f i , j f_{i,j} fi,j(可压维)为买前 i i i 个英雄的皮肤,花 j j j 元所得到的展示策略个数, p i p_i pi为第 i i i 个英雄皮肤的价格。
f i , j = max ⁡ { f i − 1 , j , f i − 1 , j − k ∗ p i ∗ k , k ∈ [ 0 , c i ] } f_{i,j}=\max\{f_{i-1,j},f_{i-1,j-k*p_i}*k,k \in[0,c_i]\} fi,j=max{fi1,j,fi1,jkpik,k[0,ci]}
答案即为 min ⁡ { j ∣ f n , j ≥ M } \min\{j|f_{n,j}\ge M\} min{jfn,jM}

洛谷P1064 金明的预算方案

附件的数量很少,可以枚举每一种附件的选择情况,将主附件的一种选择当作一个整体进行 01 背包。

洛谷P4158 粉刷匠

填个坑

区间动态规划

洛谷P4290 玩具取名

两个字符可以用一个字符替代,考虑区间动规。

f i , j , k f_{i,j,k} fi,j,k 为字符串 s [ i , j ] s[i,j] s[i,j] 能否被第 k k k 个字符替代, g i , j g_{i,j} gi,j 表示字符 i i i j j j 的替换序列(可被多个字符替换)。
f i , j , k = max ⁡ { f i , l , s   a n d   f l , j , t ∣   l ∈ [ i , j ] , k ∈ g s , t } f_{i,j,k}=\max\{f_{i,l,s }\space{and}\space f_{l,j,t}|\space l\in[i,j],k\in g_{s,t}\} fi,j,k=max{fi,l,s and fl,j,t l[i,j],kgs,t}最终答案即为 f 1 , l e n , k f_{1,len,k} f1,len,k

注:用于替换两个字母的顺序不能调换。

洛谷P1220 关路灯

UVA1336 修缮长城 Fixing the Great Wall
P2466 [SDOI2008] Sue 的小球 ,将起始点作为 y y y 0 0 0 或预处理起始点。

确定关灯顺序,对于路灯 i , j , k   ( x i < x j < x k ) i,j,k\space(x_i<x_j<x_k) i,j,k (xi<xj<xk),可证明关灯序列 i , j , k i,j,k i,j,k 一定比关灯序列 i , k , j i,k,j i,k,j 更优,因为关 k k k 可以顺手把 j j j 关了,即经过一个灯就关了。

有两种状态,沿着当前方向继续往下走,改变方向回去关(功率更大的)灯,即每次从左或右端关一个,考虑区间动态规划。

显然,关哪个路灯有后效性,故考虑将所有未关的灯的做的功作为代价 dp。

f i , j f_{i,j} fi,j 表示关区间 [ i , j ] [i,j] [i,j] 的灯最少要消耗多少电,且关完后处于点 i i i,即最后关的灯为 i i i g i , j g_{i,j} gi,j 表示关区间 [ i , j ] [i,j] [i,j] 的灯最少要消耗多少电,且关完后处于点 j j j p i p_i pi 表示位置 i i i 处的灯的功率,记

P i = ∑ j = 1 i p i P_i=\sum_{j=1}^{i}p_i Pi=j=1ipi
s i , j = P j − P i − 1 s_{i,j}=P_j-P_{i-1} si,j=PjPi1
r s i , j = s 1 , n − s i , j rs_{i,j}=s_{1,n}-s_{i,j} rsi,j=s1,nsi,j
d i , j = ∣ x i − x j ∣ d_{i,j}=|x_i-x_j| di,j=xixj
{ f i , j = min ⁡ { f i + 1 , j + d i , i + 1 r s i , j   , g i + 1 , j + d i , j r s i , j } g i , j = min ⁡ { f i , j − 1 + d i , j r s i , j   , g i , j − 1 + d j − 1 , j r s i , j } \begin{cases} f_{i,j}=\min\{f_{i+1,j}+d_{i,i+1}rs_{i,j}\space ,g_{i+1,j}+d_{i,j}rs_{i,j}\}\\ g_{i,j}=\min\{f_{i,j-1}+d_{i,j}rs_{i,j}\space , g_{i,j-1}+d_{j-1,j}rs_{i,j}\} \end{cases} {fi,j=min{fi+1,j+di,i+1rsi,j ,gi+1,j+di,jrsi,j}gi,j=min{fi,j1+di,jrsi,j ,gi,j1+dj1,jrsi,j}

CF149D Coloring Brackets

dfs + 区间 dp 。与处理出每个左括号匹配的右括号,从左到右对于每对匹配的括号覆盖的区间依次 dfs 再合并,dp 枚举合法颜色即可。

数位 DP

P2657 [SCOI2009] windy 数

数位 dp 模板题。

单调队列优化 DP

P2569 [SCOI2010]股票交易

f i , j f_{i,j} fi,j 表示 i i i 天持有 j j j 股票可以赚到的最多的钱。

f i , j = max ⁡ { − k × A P i , k ∈ [ 0 , A S i ] f i − 1 , j f i − w − 1 , j − k − k × A P i , k ∈ [ 0 , A S i ] f i − w − 1 , j + k + k × B P i , k ∈ [ 0 , B S i ] f_{i,j}=\max \begin{cases}-k\times AP_i,k\in[0,AS_i]\\f_{i-1,j}\\f_{i-w-1,j-k}-k\times AP_i,k\in [0,AS_i]\\f_{i-w-1,j+k}+k\times BP_i,k\in[0,BS_i] \end{cases} fi,j=maxk×APi,k[0,ASi]fi1,jfiw1,jkk×APi,k[0,ASi]fiw1,j+k+k×BPi,k[0,BSi]

为了单调队列优化,先化成合适的形式,枚举 k k k 变为枚举 j − k j-k jk j + k j+k j+k ,并分离优化部分。

f i , j = max ⁡ { − k × A P i , k ∈ [ 0 , A S i ] f i − 1 , j f i − w − 1 , k + k × A P i − j × A P i , k ∈ [ j − A S i , j ] f i − w − 1 , k + k × B P i − j × B P i , k ∈ [ j , j + B S i ] f_{i,j}=\max \begin{cases}-k\times AP_i,k\in[0,AS_i]\\f_{i-1,j}\\f_{i-w-1,k}+k\times AP_i-j\times AP_i,k\in [j-AS_i,j]\\f_{i-w-1,k}+k\times BP_i-j\times BP_i,k\in[j,j+BS_i] \end{cases} fi,j=maxk×APi,k[0,ASi]fi1,jfiw1,k+k×APij×APi,k[jASi,j]fiw1,k+k×BPij×BPi,k[j,j+BSi]

观察 f i − w − 1 , k + k × P i f_{i-w-1,k}+k\times P_i fiw1,k+k×Pi ,固定 i i i,对于每一个 j j j k k k 的范围类似于一个滑动窗口,于是单调队列优化即可。

CF372C Watching Fireworks is Fun

f i , j f_{i,j} fi,j 表示第 i i i 个烟花位于位置 j j j 的最大快乐度,直接枚举上一个位置。

f i , j = max ⁡ { f i − 1 , k + b i − ∣ a i − j ∣ , ∣ k − j ∣ ≤ d ( t i − t i − 1 ) } f_{i,j}=\max\{f_{i-1,k}+b_i-|a_i-j|,|k-j|\leq d(t_i-t_{i-1})\} fi,j=max{fi1,k+biaij,kjd(titi1)}

滚掉第一维。

i , j i,j i,j 不可优化,对于每个固定的 i i i , k k k 的范围随 j j j [ j − d ( t i − t i − 1 ) , j + d ( t i − t i − 1 ) ] [j-d(t_i-t_{i-1}),j+d(t_i-t_{i-1})] [jd(titi1),j+d(titi1)] ,单调队列优化 f k f_k fk 即可。

P2034 选择数字

P2627 [USACO11OPEN]Mowing the Lawn G

f i , 0 / 1 f_{i,0/1} fi,0/1 表示前 i i i 个数字,第 i i i 选不选的答案,枚举上一个位置 k k k
{ f i , 0 = max ⁡ { f i − 1 , 0 , f i − 1 , 1 } f i , 1 = max ⁡ { f k , 0 + s i − s k , k ∈ [ i − m , i ) } \begin{cases}f_{i,0}=\max\{f_{i-1,0,f_{i-1,1}}\}\\f_{i,1}=\max\{f_{k,0}+s_i-s_k,k\in [i-m,i)\}\end{cases} {fi,0=max{fi1,0,fi1,1}fi,1=max{fk,0+sisk,k[im,i)}单调队列维护 f k , 0 − s k f_{k,0}-s_k fk,0sk 的最大值即可。

洛谷P1725 琪露诺

f i f_i fi 为走到第 i i i 个格子获得的最大冰冻指数
f i = max ⁡ { f j ∣ j ∈ [ i − l , i − r ] } f_{i}=\max\{f_j|j\in[i-l,i-r]\} fi=max{fjj[il,ir]}单调队列维护 f j f_j fj 最小值即可。

矩乘优化

P1707 刷题比赛

板子题

P4838 P哥破解密码

P4967 黑暗打击

图上问题

P3758 [TJOI2017]可乐

矩乘图上问题应用,一般考虑构造出一个图,求 u → v u\rightarrow v uv 经过 k k k 条边的方案数。

停留连自环,自爆连虚点即可。

To be continued

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值