dp 专题 1

被 dp 打爆了无数次,尝试抢救一下。

大部分题来自 cf 2800+ tag=dp

2022.6.30

CF739E Gosha is hunting

先冲了个 \(n^3\) 的 dp 没跑过去,嘻嘻。思考了一会发现可以费用流莽掉。

在题解的提醒下想到了 wqs 二分,考虑把 dp 的第三维带上权消掉,并且满足一个单调关系。只需要二分把数量卡进题目范围即可。那就做完了。

CF724E Goods transportation

编了个从小到大硬点的贪心,但是没有考虑到货物可以反复传递,寄了。

最正确的做法显然是直接上网络流,但是你光建图就寄了。

考虑最大流转化成最小割,设 \(dp_{i,j}\) 表示前 \(i\) 个点,有 \(j\) 个点和 \(S\) 相邻的边没被割,就做完了。

CF671D Roads in Yusland

\(dp_{u,i}\) 表示覆盖了 \(u\) 的子树,且有一条链延伸到了 \(dep = i\) 的最小代价。

显然 \(dp_{u,i} = \sum dp_{v,i}\)。对于路径底的 \(u\)\(dp_{u,dep_{top}} \leftarrow val+\sum dp_{v,dep_v}\)

你发现这玩意可以线段树启发式合并搞定,就做完了。

CF1372E Omkar and Last Floor

从前往后 dp 假了 /kx。

考虑区间 dp,只考虑左右端点在 \(l,r\) 之间的线段。因为是平方,所以硬点一个 \(k\),它们都要在 \(k\) 处放个点,剩下的就是 \(f_{l,k-1}+f_{k+1,r}\)。非常的合理。

CF512D Fox And Travelling

注意到环上的点显然不会删去,所以把所有环扬了,变成一个森林。

这时有两种情况,第一种是与环相连,那操作顺序是定向的,在树上做一个类似背包的 dp 即可。

第二种是这个连通块本身就是一颗树。那么把它的每个节点都看作根,做一次上面的 dp。这时注意到大小为 \(i\) 的方案恰好被算了 \(n-i\) 次,因为不在方案内的点都能统计到这个方案。特别的是大小为 \(n\) 的方案,上面的 dp 相当于硬点了最后一个拿的位置,就不用管了。

把所有连通块的答案卷起来就好了。

CF1129D Isolation

这可能是我今天见到的最牛逼的题了。显然 \(O(n^2)\) 暴力大家都会。瓶颈是计算一个带权的 \(u_{i,j}\),大概是维护 \([i,j]\) 之间出现一次的数的一些信息。

尝试用数据结构搞掉,发现需要支持区间 +/- 某些数,并且对 \(\leq k\) 的数带权求和。正常做法是分块+BIT,但是这题因为只需要加减 1,可以直接上桶,块上记个 tag 就可以了。

俺的 ds 技巧怎么退步这么多呢 /qd。

2022.7.1

CF559E Gerald and Path

先离散化一波,左端点从左到右排序,大力设 \(f_{i,j}\) 表示考虑了前 \(i\) 条线段,最右覆盖在 \(j\) 的最大价值。随便转移。

CF1279F New Year and Handle Change

不是,这都能 wqs 二分的吗。wqs 二分是什么勾八东西啊 /fn。

毛估估一下,随着单次费用上升,用的次数会越来越少,然后它就凸了(?)

套板子就完事了。注意二分完之后要在做一遍答案,防止出现神必情况。

CF755G PolandBall and Many Other Balls

毫无 poly 技巧.jpeg。

显然直接推出 dp 式子,发现次数不大,手动解一下特征方程,然后就做完了。

题解区里 Karry5307(卡老师 /se/se/se/se)给出了另外一个做法,考虑合并长为 \(a\)\(b\) 的两段,推一推式子,搞出 \(F_n \rightarrow F_{2n}\) 的方法,然后可以倍增做。我大受震撼。

qwaszx 的递推做法根本看不懂,爬了。

CF1648D Serious Business

先特判只经过一个区间的。

对于经过若干个区间的,设最后一个区间是 \([l,r]\),路径一定是现在第一行走,然后走到第二行,然后 rush 到 \(l-1\)。动态求出到第二行第 \(i\) 列的最大价值 \(f_i\),这显然总能搞出来。

考虑枚举最后一个区间 \([l,r]\) ,贡献就是 \(-val+f_{k-1}-sumb_{k-1}+sumc_n+max_{x=l}^r(sumb_{x}-sumc_{x-1})\),这东西大力线段树 / ST 表维护就行了。

2022.7.2

CF1383E Strange Operation

考虑一个串什么时候是最优匹配,发现一个目标串的 0 在原串里一定是连续的。

大力设 \(f_{i,0/1}\) 表示最优匹配到 \(i\) ,结尾是 \(0/1\) 的方案数。发现不好转移。设 \(nxt_{i,0/1}\) 表示在第 \(i\) 位后面加上 \(0/1\) 会匹配到哪个点。发现 \(nxt_{i,1}\) 就是最近的 \(1\)\(nxt_{i,0}\) 比较复杂,如果它是一段 \(0\) 的末尾,就是下一段长度更长的连续 \(0\) 的对应位置,否则就是下一个 \(0\)

\(f_{i,j} \rightarrow f_{nxt_{i,k},k}\),就做完了。

LOJ507「LibreOJ NOI Round #1」接竹竿]

推推式子,只跟相同颜色的有关。所以每个颜色维护一个最大值就做完了。(乱入)。

2022.7.4

CF536D Tavas in Kansas

发现 \(n\) 不大,就搞一个 \(n \times n\) 的表,每次只会取上面一行或者左边一列。随便转移。

CF1322D Reality Show

毛估估一下,反着打是一样的。有了 NOIP2021T2 的教训,从大往小打要多记个状态,不优。设 \(f_{i,S}\) 表示最后一个选的是 \(i\),当前场上二进制集合是 \(S\) 的最大收益。反正数据范围小,转移根据 \(l_i\)\(l_j\) 的大小关系随便搞搞就行了。

CF1063F String Journey

序列翻转,显然长度不会超过 \(\sqrt{n}\)\(f_{i,j}\) 表示第 \(i\) 个结尾长度为 \(j\) 是否合法,随便转移。

还有一种方法是设 \(dp_i\) 表示第 \(i\) 位结尾最长的合法串。发现 \(dp_{i-1}+1\ge dp_i\),每次减+判断,看起来显然可以在 SA 上二分搞定。

太困了已经神志不清了。润。

posted @ 2022-07-01 09:27  ZSH_ZSH  阅读(105)  评论(1)    收藏  举报