AtCoder DP系列刷题记录

https://www.luogu.com.cn/training/313353

直面自己的弱点。

* 的为在做题过程中有看题解的题。

1|0A Frog 1

dpi 表示跳到第 i 块石头的最小花费,则有:

dpi+=min(|aiai1|,|aiai2|)

2|0B Frog 2

很快就写完了,但是一直调了十分钟,耻辱啊。

dpi 表示跳到第 i 块石头的最小花费。显然如果反着跳,第 i 根木桩只能从第 i+1i+2 木桩上跳到,则有:

dpi=min(dpi+1+|aiai+1|,dpi+2+|aiai+2|)

3|0C Vacation

语文课花两分钟想出来的。

dpi,j 表示到第 i 天时,做第 j 件时获得的最大总幸福度。显然对于 ai,它只能接受 bi1ci1 的转移,其他两边情况相同,则有:

dpi,0=max(dpi1,1,dpi1,2)+ai

dpi,1=max(dpi1,0,dpi1,2)+bi

dpi,2=max(dpi1,0,dpi1,1)+ci

4|0D Knapsack 1

01 背包板子,不讲了。

5|0E Knapsack 2

01 背包基本一致,但数据范围大了很多,将 dp 数组表示的东西换一下就行了,不表示价值,表示重量。像 01 背包一样压维,则有:

dpj=min(dpj,dpjvi+wi)

6|0F LCS

经典题,就是恶心了一点。

dpi,j 表示到 s 的第 i 位,t 的第 j 位时的最大公共子序列长度,则有:

dpi,j={dpi1,j1+1,ai=bjmax(dpi1,j,dpi,j1),otherwise.

然后再记录一个 from 数组,方便找到这一位是从前一位中的 dpi1,j1,dpi1,j,dpi,j1 的哪个转过来的。

然后从后往前再跑一遍找到这个最大公共子序列即可。

7|0G Longest Path

拓扑排序模板题。

dpi 表示以 i 为终点的路径最大长度。若有 vu,则有:

dpu=max(dpu,dpv+1)

然后先跑出拓扑序,然后按序 dp 即可。

8|0H Grid 1

突然冒出来一道比前面所有题都简单的题...

dpi,j 表示到第 i 行第 j 列有多少种走法。则有:

dpi,j={dpi,j1+dpi1,j,ai,j= . 0,otherwise.

9|0I Coins

dpi,j 表示前 i 个硬币中,有 j 个正面朝上的概率,则有:

dpi,j=dpi1,j1×pi+dpi1,j×(1pi)

10|0*J Sushi

其实不难,当时脑子没转过来。

dpi,j,k,l 表示有 i 个没有寿司的盘子、j 个有 1 个寿司的盘子、k 个有 2 个寿司的盘子时的期望次数,l 个有 3 个寿司的盘子时的期望次数,则有:

dpi,j,k,l=an×dpi,j,k,l+bn×dpi+1,j1,k,l+cn×dpi,j+1,k1,l+dn×dpi,j,k+1,l1+1

移项得:

dpi,j,k,l=jj+k+l×dpi+1,j1,k,l+kj+k+l×dpi,j+1,k1,l+lj+k+l×dpi,j,k+1,l1+nj+k+l

发现有 0 个寿司的盘子数是可以通过其他三个盘子的数量和总数 n 算出来的,压掉一维,然后有:

i=njkl

转移方程:

dpj,k,l=jj+k+l×dpj1,k,l+kj+k+l×dpj+1,k1,l+lj+k+l×dpj,k+1,l1+nj+k+l

11|0K Stones

当一名玩家操作时剩余石子为 0,则另一位玩家必胜,由此可以倒推。

dpi 表示在剩余 i 个石子时,先手胜还是后手胜,则有:

dpi={1,aji,dpiaj=00,otherwise.

12|0L Deque

区间 dp 典题。

dpl,r 表示在剩余下标为 [l,r] 的区间时,当前取数的人能获得的最大数字和,则有:

dpl,r=max(dpl+1,r+sumrsuml1,dpl,r1+sumrsuml1)

直接搞会超时,所以用前缀和维护即可。

13|0M Candies

dp 五分钟,优化半小时。

dpi,j 表示前 i 个人分 j 颗糖的方案数,则有:

dpi,j=l=0aidpi1,jl

然后我就自信的交了一发,由于前面十分顺利,我甚至没发现复杂度是错的...

之后加了个前缀和,但是调了好久,最后才发现 jai1 有可能小于 0,警示后人。

14|0N Slimes

区间 dp 模板题。

dpi,j 表示 ai 合并到 aj 的最小代价,枚举中间点 k,则有:

dpi,j=min(dpi,j,dpi,k+dpk,j+l=ijal)

前缀和维护即可。

15|0*O Matching

第一道蓝题出现了!

应该是状压 dp 模板题。经典写不出状压。

定义集合 S,当中只包含女人的编号,然后去枚举第 i 个男人和哪个女人匹配。

dpS 表示前 i 个男人与 S 中的女人的匹配方案数,则有:

dpS=dpSi,iS

然后将它变为一个 n 位的二进制数,如果右往左第 i 位为 1,就表示 S 有编号为 i 的女人,否则没有。

然后状压 dp 即可。

16|0P Independent Set

简单树形 dp

dpi,j 表示将 i 节点染成 j 号颜色的方案数。不能连续染 2 个黑,所以黑的状态只能由白来传递,而白可以由黑白传递,则有:

dpu,0×=dpv,1

dpu,1×=dpv,0+dpv,1

17|0Q Flowers

dpi 表示在满足条件下前 i 朵花能达到的权值最大值,则有:

dpi=ai+maxj=1i1dpj

然后树状数组维护 max(dp1,dpi1) 即可。

18|0*R Walk

dpu,v,len 表示 uv,长度为 len 的条数。枚举中点 mid,则有:

dpu,v,s=dpu,mid,len1×dpmid,v,1

然后使用矩阵快速幂维护即可。

19|0*S Digit Sum

第一次做数位 dp

特别感谢 yinhee 大佬,他的讲解令我受益匪浅。

dppos,res,lim 表示当前枚举到从高位往低位数第 pos 位,数字和取模后的余数为 res 时的方案数,其中 lim 可以理解为一个布尔值,0 表示没有到上限,1 表示到了上限。

然后是一个数位 dp 的板子,我特别讲一下这一行代码:

tot+=dfs(pos-1,(res+i)%d,(lim!=0)&&(i==maxx));

其中 maxx 是当前枚举位可选的最大值。

这里就是在枚举第 pos1 位,选择了 i 作为这位的数,res+i 就是新的数字和。而后面的判断条件就是在看枚举到目前为止,该数是否还与 k 的前缀相同,是就说明到目前为止还是最大的,否则就不是。

20|0T Permutation

不会,先鸽着。

21|0U Grouping

范围识状压。

dpi 表示状态为 i 时的最大收益。那么我们可以枚举其子集 jk 为其补集,则有:

dpi=max(dpi,dpj+dpk)

22|0V Subtree

dpu 表示 u 号节点染黑后,其子树内黑点构成连通块的方案数,则有:

dpuvsonudpv+1

然后换根,则有:

ansdpu=ansdpudpu+1

然后有:

ansu×=ansdpu+1

23|0W Intervals

24|0X Tower

好水的题,秒了。

看到题面就知道是背包,唯一的问题是怎么优化其复杂度。

如果将 x 放于 y 上,那么上面还能堆 xsyw 的东西,反之则能堆 ysxw 的东西,所以若有 xsyw<ysxw,则将第 x 个箱子放在第 y 个箱子下更优。

排序完再跑背包即可。

25|0Y Grid 2

26|0Z Frog 3


__EOF__

本文作者yizhixiaoyun
本文链接https://www.cnblogs.com/yizhixiaoyun/p/17390790.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   yizhixiaoyun  阅读(163)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示