思维题
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=fi−1,j−1,k+fi−1,j,k−1+(i−2)×fi−1,j−1,k−1
dp 考虑按大小插入。
线性动态规划
最大子段和
考虑dp, f i = max { f i − 1 + a i , a i } f_i=\max\{f_{i-1}+a_i,a_i\} fi=max{fi−1+ai,ai}。
或考虑定义 max { s i − s k , k ∈ [ 1 , i ] } \max\{s_i-s_k,k\in[1,i]\} max{si−sk,k∈[1,i]},维护 s k s_k sk 最小值。
-
长度限制,不超过 m m m ,则 k ∈ [ i − m , i ] k\in[i-m,i] k∈[i−m,i],至少为 m m m ,则 k ∈ [ 0 , i − m ] k\in[0,i-m] k∈[0,i−m]
-
环状,断环成链,做长度不超过 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{fi−1,j−1,1,fi−1,j,0}fi,j,1=max{fi−1,j,1,fi−1,j−1,1,fi−1,j−1,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{fi−1,j−1,1,fi−1,j,0}fi,j,1=max{fi−1,j,1,fi−1,j−1,0}+ai
-
上下限,不含负数,尺取法即可。
-
上下限,含负数,将前缀和离散化,即最小化 j − i j-i j−i,满足 s j − s i > = S s_j-s_i>=S sj−si>=S,枚举 j j j,查询不大于 s j − S s_j-S sj−S 最大的 s i s_i si 即可,用数据结构维护。
-
环状两段,不跨越 n → 1 n\rightarrow 1 n→1,最大两段和,跨越 n → 1 n\rightarrow 1 n→1,总和 − - − 不跨越的最小不相邻两段和。
洛谷P1521 求逆序对
考虑在
n
−
1
n-1
n−1 的排列中插入
n
n
n,能新增的逆序对数
∈
[
0
,
n
−
1
]
\in[0,n-1]
∈[0,n−1],设
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=j−i+1∑jfi−1,k=gi−1,j−gi−1,j−i
洛谷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={fi−1,j−ai+1,fi−1,j>01,∀fi−1,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,0∣i∈[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=prej−prei−1 。
由题 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∴(prej−prei−1)mod7=0∴prej≡prei−1(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{j−i+1 ∣ prej≡prei(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{fi−1,j−1+di}fi,0=max{fi−j,0,fi−j,1,⋯,fi−j,j−1,fi−j,j ∣ i−j≥0}
动态维护
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}
fi−j,0,fi−j,1,⋯,fi−j,j−1,fi−j,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=fi−1,0,0+difi,j,1=fi−1,j−1,1,j>1fi,0,0=max{fi−1,1,0,fi−1,1,1,fi−1,0,0}fi,j,0=max{fi−1,j+1,0,,fi−1,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 i−1 位箭头为 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{fi−1,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{fi−1,2,1,fi−1,3,1}+vi,1fi,2,0=fi−1,3,1+vi,2fi,2,1=fi−1,1,0+vi,2fi,3,1=max{fi−1,2,0,fi−1,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}
fi−1,.j−1。
否则考虑删除 A ,
f
i
−
1
,
j
+
1
f_{i-1,j}+1
fi−1,j+1,删除 B,
f
i
,
j
−
1
+
1
f_{i,j-1}+1
fi,j−1+1 ,改变使得此时 A , B 末尾字符相同,
f
i
−
1
,
j
−
1
+
1
f_{i-1,j-1}+1
fi−1,j−1+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={fi−1,j−1,Ai=Bjmin{fi−1,j+1,fi,j−1+1,fi−1,j−1+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{fi−1,j−1+∣Ai−Bj∣,fi−1,j+k,fi,j−1+k}
洛谷P4059 找爸爸
跟上面一题很相似,即按原序列匹配,或插入空格。
对于按原序列匹配的情况同上题。
对于空格字符的处理,一段长为 k k k 的空格造成 g ( k ) = − x − y ( k − 1 ) g(k)=−x−y(k−1) g(k)=−x−y(k−1) 的贡献,考虑递推式
g ( 1 ) = − x g(1)=-x g(1)=−x , g ( k ) = g ( k − 1 ) − y g(k)=g(k-1)-y g(k)=g(k−1)−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{fi−1,j−1,0, fi−1,j−1,1, fi−1,j−1,2}+dAi,Bjfi,j,1=max{fi−1,j,0−x, fi−1,j,2−x, fi−1,j,1−y}fi,j,2=max{fi,j−1,0−x, fi,j−1,1−x, fi,j−1,1−y}
严格的将上次状态,这次状态相对于上一个状态改变的部分区分开来(即本次状态需要修改的部分),才能保证不遗漏也不重复。
树形动态规划
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,0−fv,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,k−j+fv,j+[(szv−j)×(n−k−szv+j)+j×(k−j)]×wu,v,j≤min{k,szu}}
注意 f u , j − k f_{u,j-k} fu,j−k 可能没有意义,因为已经更新的子树的 ∑ s z \sum sz ∑sz 小于 j − k j-k j−k。
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,i−1{gu,1=wprtugu,i=gprtu,i−1+fprtu,i−1−fu,i−2换根时 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} cur←cur−fu,k+fv,k−1−gu,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
fi≥tj。
注:该题状态
f
i
f_i
fi 不具有单调性,即 for 循环中终止条件不可加入(部分)可行性判断,如
f
i
≥
t
j
f_{i} \ge t_j
fi≥tj。
洛谷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,ci−2k, k k k 为满足 c i ≥ 2 k c_i \ge 2^k ci≥2k的最大正整数,从而使得 1 ∼ c i 1\sim c_i 1∼ci 中的每一个数都能被其中的数表示出来,然后进行 01 背包即可。
考虑单调队列优化,然而我不会 。
洛谷P5365 英雄联盟
构造背包模型,对于每个英雄,其皮肤可选 0 ∼ c i 0\sim c_i 0∼ci 种,考虑将皮肤数量作为容量,展示策略个数作为价值。
设
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{fi−1,j,fi−1,j−k∗pi∗k,k∈[0,ci]}
答案即为
min
{
j
∣
f
n
,
j
≥
M
}
\min\{j|f_{n,j}\ge M\}
min{j∣fn,j≥M}
洛谷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],k∈gs,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=Pj−Pi−1
r
s
i
,
j
=
s
1
,
n
−
s
i
,
j
rs_{i,j}=s_{1,n}-s_{i,j}
rsi,j=s1,n−si,j
d
i
,
j
=
∣
x
i
−
x
j
∣
d_{i,j}=|x_i-x_j|
di,j=∣xi−xj∣
{
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,j−1+di,jrsi,j ,gi,j−1+dj−1,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=max⎩⎪⎪⎪⎨⎪⎪⎪⎧−k×APi,k∈[0,ASi]fi−1,jfi−w−1,j−k−k×APi,k∈[0,ASi]fi−w−1,j+k+k×BPi,k∈[0,BSi]
为了单调队列优化,先化成合适的形式,枚举 k k k 变为枚举 j − k j-k j−k 和 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=max⎩⎪⎪⎪⎨⎪⎪⎪⎧−k×APi,k∈[0,ASi]fi−1,jfi−w−1,k+k×APi−j×APi,k∈[j−ASi,j]fi−w−1,k+k×BPi−j×BPi,k∈[j,j+BSi]
观察 f i − w − 1 , k + k × P i f_{i-w-1,k}+k\times P_i fi−w−1,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{fi−1,k+bi−∣ai−j∣,∣k−j∣≤d(ti−ti−1)}
滚掉第一维。
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})] [j−d(ti−ti−1),j+d(ti−ti−1)] ,单调队列优化 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{fi−1,0,fi−1,1}fi,1=max{fk,0+si−sk,k∈[i−m,i)}单调队列维护
f
k
,
0
−
s
k
f_{k,0}-s_k
fk,0−sk 的最大值即可。
洛谷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{fj∣j∈[i−l,i−r]}单调队列维护
f
j
f_j
fj 最小值即可。
矩乘优化
P1707 刷题比赛
板子题。
P4838 P哥破解密码
P4967 黑暗打击
图上问题
P3758 [TJOI2017]可乐
矩乘图上问题应用,一般考虑构造出一个图,求 u → v u\rightarrow v u→v 经过 k k k 条边的方案数。
停留连自环,自爆连虚点即可。