动态规划DP

Posted on 2025-04-18 23:18  K_J_M  阅读(27)  评论(0)    收藏  举报

P3694 邦邦的大合唱站队

\(n\) 个偶像排成一列,他们来自 \(m\) 个不同的乐队。每个团队至少有一个偶像。

现在要求重新安排队列,使来自同一乐队的偶像连续的站在一起。重新安排的办法是,让若干偶像出列(剩下的偶像不动),然后让出列的偶像一个个归队到原来的空位,归队的位置任意。

请问最少让多少偶像出列?

此题是状压dp。
因为 \(n≤10^5,m≤20\),考虑从组别考虑。我们可以将属于同一个组的看作一个整体,那么最后相当于一个长度为 \(m\) 的数列。我们记 \(f_i\) 表示状态为 \(i\) 下排在前面的最小出队人数,从左往右 \(1\) 代表此组已经排好。对于每一组,它的人数记为 \(n_i\),那么我们在前面放置排好的这些组,长度为 \(L=\sum_{i=1}^{n}[S\& 2^{i-1}]\times n_i\),我们枚举排在最后的组 \(i\),那么它所占的区间就是 \([L-n_i+1,L]\),我们只需要看这个区间里原本有多少不是属于组 \(i\) 的即可,这一部分采用前缀和优化。记 \(s_{i,j}\) 表示前 \(i\) 中不属于组 \(j\) 的个数。那么我们的转移方程即为 \(f_i=\min\{f_{i-2^{j-1}}+s_{L,j}-s_{L-n_j}\}\)

P1370 Charlie的云笔记序列

某天,Charlie 将收藏的题目抽象为一个序列。\(a=[a_1,a_2,a_3,\cdots,a_{n-1},a_n]\)

Charlie 对序列 \([a_i]\) 定义了一个函数 \(F(l,r)\),表示序列 \(a[l:r]\) 的本质不同的子序列个数。特别地,一个空序列也被当作一个本质不同的子序列。

长度为 \(n\) 的序列 \(a\) 和长度为 \(m\) 的序列 \(b\) 被称作本质不同的,当且仅当 \(n\neq m\),或存在 \(i\),使得 \(a_i \neq b_i\)。反之,则称这 \(2\) 个序列是本质相同的。

现在 Charlie 想知道,\(\sum _{1\le l\le r\le n} F(l,r)\) 的值是多少。由于这个数可能很大,请输出它对 \(998244353\) 取模后的结果。

线性 dp。
\(f_i\) 表示 \(\sum_{j=i}^{n}F(i,j)\),那么答案为 \(\sum_{i=1}^{n}f_i\)。首先如果序列的每一个数都不同,那么显然 \(f_i=2\times f_{i+1}+2\),原因是前面 \([i+1,n]\) 所能产生的 \(f_{i+1}\) 个子序列本身可以作为答案的一部分,然后这 \(f_{i+1}\) 个子序列接上 \(a_i\) 又可以产生 \(f_{i+1}\) 个,然后考虑 \(a_i\) 本身和空集,总共是 \(2\times f_{i+1}+2\)。接下来考虑去重。如果存在 \(a_i=a_j\)\(i<j\),那么统计 \(f_i\) 的时候 \([j+1,n]\) 区间所产生的 \(f_{j+1}\) 个子序列和 \(a_j\) 接上与和 \(a_i\) 接上效果是一样的,这样我们重复计算了 \(f_{j+1}\) 个,所以减去,然后 \(a_i\)\(a_j\) 本身两个单独的又算了一遍,所以我们需要减去 \(f_{j+1}+1\)。由于我们每一次出现重复的都减去了,所以对于每一个 \(i\),我们不需要找前面所有与 \(a_i\) 相同的,只需要找第一个与 \(a_i\) 相同的即可,因为前面的已经减去了。

P1283 平板涂色

CE 数码公司开发了一种名为自动涂色机(APM)的产品。它能用预定的颜色给一块由不同尺寸且互不覆盖的矩形构成的平板涂色。

为了涂色,APM 需要使用一组刷子。每个刷子涂一种不同的颜色 \(C_i\) 。APM 拿起一把有颜色 \(C_i\) 的刷子,并给所有颜色为 \(C_i\) 且符合下面限制的矩形涂色:

为了避免颜料渗漏使颜色混合,一个矩形只能在所有紧靠它上方的矩形涂色后,才能涂色。例如图中矩形 \(F\) 必须在 \(C\)\(D\) 涂色后才能涂色。注意,每一个矩形必须立刻涂满,不能只涂一部分。

写一个程序求一个使 APM 拿起刷子次数最少的涂色方案。注意,如果一把刷子被拿起超过一次,则每一次都必须记入总数中。

看到数据范围\(C_i≤20,N≤16\) 想到状压 dp。设状态 \(f_{i,j}\) 表示矩阵涂色的状态为 \(i\),当前涂到 \(j\) 颜色的最少次数。我们将一次性将所有能涂的相同颜色的矩阵全涂好色拆分成一个一个涂,即我们可以从前面相同颜色转移过来不耗费任何代价,也可以从不同颜色转移过来,耗费 \(1\) 的代价。设当前涂的颜色 \(j\) 的矩阵编号为 \(k\),方程为 \(f_{i,j}=\min\{f_{i-2^{k-1},l}+1\},l≠j\)\(f_{i,j}=\min\{f_{i-2^{k-1},j}\}\)。其余细节较多,我们需要处理每一个矩阵需要哪些矩阵涂好色以后才能涂。