ATcoder dp

link

A

这种就是最典型有阶段,没法贪心的问题。fi 表示考虑到第 i 个石头的答案。fi=min(fi1+v(i1,i),fi2+v(i2,i))

B

和 A 一样的不写了。如果 k 比较大应该可以权值线段树优化转移。

C

一维记不下就开二维。fi,0/1/2 表示考虑到第 i 天,选择了哪种活动。分类讨论转移即可。

D

背包问题。总是被干爆所以写详细一点。设 fi,j 表示考虑到第 i 个物品,用的空间 j 的最大价值,fi,j={fi1,jfi1,jwi+vi  (jwi)

发现可以压掉一维,因为你一个物品只能用一次,所以不能用 fi,jwi 的转移,要从后往前枚举转移。

背包问题的 dp 想法是非常常见的。第二维可以表示你要求限制的东西。

ex : 在 n(ai,bi) 中选出若干个使得 gcd(ai)=1 的同时最小化 bi

sol : 考虑把上面那个的第二维改成当前的 gcd,由于 gcd 比较少,直接套个 umap 转移即可。

E

简单 trick,考虑把上面那个东西的第二维和答案换一下,fi,j 表示考虑到第 i 个物品,价值为 j 的最小空间。该怎么转移怎么转移。

F

fi,j 表示考虑 sitj 的答案。fi,j=max{fi1,jfi,j1fi1,j1+1  (si=tj),输出答案就看决策在哪边就行了。

G

变成拓扑序之后就有转移阶段了,fu=maxvGufv+1

H

fi,j 表示当前在 (i,j) 的答案,转移的时候判掉障碍即可。

上面的题其实都没写代码(


上面权当练习 LATEX 了,下面是正题。

I

你直接计算这个胜率是不太现实的,设 fi,j 表示前 i 次,硬币向上有 j 次,fi,j=pifi1,j1+(1pi)fi1,j

J

期望会不了一点啊。期望有一个可加(线性)性,所以你可以递推求和,把每一步的期望加起来。设 fi,j,k 表示还有 i 个剩 1j 个剩 2k 个剩 3nijk 个剩 0,整理一下可以得到 fi,j,k=1i+j+k(ifi1,j,k+jfi+1,j1,k+kfi,j+1,k1+n)。递推的时候按 k,j,i 的顺序转移消除后效性。然后期望 dp 还有要做一个事情是从结果反推开头。

K

公平组合游戏。fi=0/1 表示你操作 i 时必败/必胜,显然对于 x 如果 fxai=0,那么 fx=1,初始状态 f0=0 递推即可。同时,如果 fxai=1,那么 fx=0,不过这并没有什么必要,因为你初始都是 0。

L

dp 最优化博弈。设 fl,r 表示 [l,r] 的答案。转移考虑取两边,如果长度为奇数,答案尽量大,取 max 转移,否则,答案尽量小,取 min 转移。

M

先暴力设 fi,j 表示前 i 个人,吃了 j 颗糖,暴力转移
fi,j={k=0jfi1,j  (jai)k=0aifi1,jk  (j>ai)
显然的前缀和形式,优化完就是 O(nk) 的。可以滚掉一维。

N

这种和区间扩展/缩小有关的考虑区间 dp。设 fl,r 表示 [l,r] 的答案。枚举断点 fl,r=min(fl,k+fk+1,r+s(l,r))s 为前缀和,预处理即可。

O

这个数据范围考虑状压。设 fi,s 表示考虑前 i 个左部点,匹配的右部点状态为 s,每次转移 popc(s)=i 的状态,fi,sfi1,s1<<j(jsjGi)。然后就过了,看眼题解似乎可以优化一下复杂度。发现第一维不仅可以滚掉,并且还能被 s 表示出来,那让 i=popc(s),时间复杂度和空间复杂度都少了一个 n

P

树形 dp。设 fu,0/1 表示以 u 为根的答案,u 是黑/白。运用合并儿子信息的想法,设 vsonu,分类讨论转移 fu,0=fv,1,fu,1=(fv,0+fv,1)

Q

fi 表示考虑到 i,强制以 i 结尾的答案。暴力转移 fi=maxhj<hifj+ai。直接树状数组优化转移即可。

R

考虑设 fx,i,j 表示 ij 长度为 x 的路径数。有 fx,i,j=k=1nfx1,i,k+f1,k,j,发现这个就是矩阵快速幂优化的形式,直接套上去就对了。

S

数位 dp。设计 dfs(i, now, lim) 表示当前考虑从后往前考虑到第 i 位,当前余数为 now,是否有顶数字上界。暴力转移,记忆化即可。


以下是较有难度的题目。

T

直观感受会设 fi,j 表示考虑到 ii 填了 j 的方案数,但是你这样需要保证 j 没有被填过,于是转而设状态表示当前 i 排名为 j。暴力转移 fi,j={k=1j1fi1,k  (si1=<)k=ji1fi1,k  (si1=>),直接前缀和优化转移即可。

U

状压首先考虑 fs 表示考虑到状态 s 的答案,死去的背包开始攻击我,转移就是 fs=maxtsft+fst

V

首先这是 dp,其次你要对所有节点求答案,考虑换根 dp,首先有 fu=vsonu(fv+1),然后考虑换根造成的影响,他的父亲变成了他的儿子,那么 fa 少了一个儿子,ffa=ffafu+1u 多了一个儿子,fu=fu×(ffa+1)。没法求逆元所以用前缀和后缀乘积拼起来。

W

考虑设 fi 表示考虑到 i 强制在 i 放 1,暴力转移有 fi=max(fj1+jlkirkak)。考虑线段树优化,在线段树上放 f+,然后扫描线,扫到 rk 加上 [lk,rk] 的贡献 ak 来维护 f 就是全局最大值。

X

发现很像一个背包问题,但问题就在还有 s 的限制。考虑排序解决这一维,然后自然想到邻项交换贪心,考虑剩余的承重能力,如果 ij 上面,siwj<sjwi,即 si+wi<sj+wj。然后设 fi,j 表示考虑前 i 个,使用重量 j 的答案。选择 i 的转移时要注意重量不能超过承重。

Y

地图很大肯定不能直接 dp,但是障碍很少,考虑用总方案减去不合法方案,设 d((x1,y1)(x2,y2))=(x2x1+y2y1x2x1),表示 (x1,y1)(x2,y2) 的路径数,设 fi 表示走到第 1 个遇到的障碍是障碍 i 的路径数,则 fi=d((xi,yi)(n,m))gi,其中 gi 表示第一个遇到的障碍是障碍 i 的方案数。有 gi=d(1,1,xi,yi)xj<xiyj<yid(xj,yj,xi,yi)gj,为了保证转移无后效性按 x 排序。答案即为 d(1,1,n,m)fi

Z

先暴力 dp fi=min(fj+hi2+hj22hihj+c),这个式子有 i,j 相乘的项,考虑去凑斜率优化的形式。当 j 为最优决策点时,有 fihi2c=2hihj+fj+hj2,此时 b=fihi2c,k=2hi,x=hj,y=fj+hj2k 单增,要求 b 最小,单调队列维护一个下凸壳即可。这个压轴题也太板了一点。

作者:VitrelosTia

出处:https://www.cnblogs.com/VitrelosTia/p/18731518

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   VitrelosTia  阅读(32)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
more_horiz
keyboard_arrow_up light_mode palette
选择主题
点击右上角即可分享
微信分享提示