7.16 动态规划

发布时间 2023-07-16 12:30:28作者: Linnyx

线性DP

[USACO20DEC] Sleeping Cows P

先不考虑极大,将奶牛和牛棚放在一起排序并离散化,设 \(F_{i,j}\) 为处理到第 i 个元素(奶牛/牛棚) ,有 j 头奶牛还没有进入牛棚的方案数。

对于牛棚:

\[F_{i,j}\rightarrow F_{i+1,j} \]

\[j*F_{i,j}\rightarrow F_{i+1,j-1} \]

对于奶牛:

\[F_{i,j}\rightarrow F_{i+1,j+1} \]

考虑极大,一头奶牛可能之后会被匹配,所以我们在加入一头奶牛时就考虑它最终会不会被匹配。

注意到如果废弃了一头奶牛,那么在它之前的牛棚可以被废弃,而在它之后的牛棚不能被废弃。

如果我们去记录一头奶牛被废弃的时间,时间复杂度爆炸,但是我们发现以第一头被废弃的奶牛为分界点,后面的牛棚不能废弃,而之前的可以,所以我们只用关心当前有没有被废弃的奶牛就可以了。

新状态:

\(F_{i,j,0/1}\) 表示当前考虑了大小 \(\le i\) 的奶牛和牛棚,且有j头奶牛还未分配牛棚,目前是否钦定过不被匹配的奶牛,其中 1 表示目前没有被废弃的奶牛。

对于牛棚:

1.\(F_{i,j,1}\rightarrow F_{i+1,j,1}\quad\)废弃这个牛棚

2.\(j*F_{i,j,1}\rightarrow F_{i+1,j-1,1}\quad\)拿这个牛棚去匹配队列的一头待匹配的牛

3.\(j*F_{i,j,0}\rightarrow F_{i+1,j-1,0}\quad\)同上

对于奶牛,讨论废不废弃即可。

1.\(F_{i,j,1}\rightarrow F_{i+1,j+1,1}\)

2.\(F_{i,j,1}\rightarrow F_{i+1,j,0}\)

3.\(F_{i,j,0}\rightarrow F_{i+1,j+1,0}\)

4.\(F_{i,j,0}\rightarrow F_{i+1,j,0}\)

时间复杂度:\(O(n^2)\)

「KDOI-03」构造数组

设计状态:\(F_{i,j}\)表示目前处理到第i个,前i-1个\(a_i\)已经全部等于\(b_i\) ( \(b_i归零\) ),后面需要拿出\(j\)与前面配对,加入一个\(a_i\),考虑还债还是继续加债,转移:

枚举拿\(u\)出来还债,其它用来加债

转移待补

\[F_{i,j}(0\le j \le \sum b_{i})*C_{u}^{l}* \]

时间复杂度:\(O((\sum b_i)^2)\)

Rotating Substrings

一次操作实际上是将\(S_r\)拿出来放到\(s_{l-1}\)\(s_l\)之间。

设计状态:

\(F_{i,j}\)表示考虑S后缀i-n,T后缀j-n,最少拿元素使后缀匹配

\(1. F_{i,j}\leftarrow F_{i+1,j+1}\quad(s_i=t_j)\)

\(2.F_{i,j}\leftarrow F_{i+1,j}+1\)

\(3.F_{i,j}\leftarrow F_{i,j+1} \; the\;number\;of\;t_j\;in\;T \le the\;number\; of\;t_j\;in\;S\)

Array Beauty

排序,设\(F_{i}\)表示美观度\(\ge i\)的方案数

答案即为\(\sum F_i\)

设计\(dp_{i,j}\)指前i个,\(a_i\)必选,序列长度为j

转移:待补

「USACO 2021.12 Platinum」Paired Up

匹配互不相交(因为相交可以交换),设计\(F_{i,j}\)表示考虑i头h奶牛和j头s奶牛

树形dp

Maximizing Root

待补

Tree Elimination

通过序列可以还原出擦边顺序,记\(F_{u,0/1/2/3}\)表示点u没擦除标记/擦除边在父边之前/擦除边为父边/擦除边在父边之后

按(u,v)的出边编号从小到大转移,形式有3种,分别为u擦除前/擦除时/擦除后