AtCoder DP 专题做题记录
搬运自我的洛谷同名文章。
前言
没写记录的题目就是没 A,原因可能是太简单了或太难了。
C
转移显然。初始值
另:连续两天以上其实是连续两天及以上,刚开始以为是连续两天以上然后式子推复杂了,然后 WA on 样例#3。
E
一个很有趣的题目。
发现是 0-1 背包板子,但是
发现数据的弱点在于
数据小到甚至不用滚动数组优化,好耶。
G
一眼 SPFA,二眼有向无环图,带着疑惑往后看发现逆天数据范围
于是考虑有向无环图这个条件,想到记搜,
时间显然优秀。
I
其实没有什么辨识度。
J
期望 DP。
做这种题目的时候总是苦恼:因为总是会有状态会选无限次但是收敛,这个时候就不好正着转移。这道题亦如此。看了一下题解,知道了:正着转移不行就反着转移。
发现这道题的弱点在于:
那么有转移:
- 随机到寿司数为
的盘子: 。 - 随机到寿司数为
的盘子: 。 - 随机到寿司数为
的盘子: 。 - 随机到寿司数为
的盘子: 。
那么答案为:
发现
没关系,我会移项!
将
那么答案是
K
带有博弈论元素的 DP。
同样的,做这种题目的时候总是纠结于“最优策略”。
其实只要找准结束状态,然后去 DP 这个状态是否可以达到结束状态就行了。
发现当拿完的时候当前操作者必败。有发现若操作奇数次拿完则先手胜,否则后手。
于是设状态
不用初始化,直接全部赋权为
L
考虑区间 DP。
刚开始为什么会想
其实第三维
直接
若当前区间是第一个人操作,那么
否则
然后答案是
M
或许是训练前缀和优化 DP。
那么有
时间复杂度
发现可以前缀和优化
N
石子合并弱化版,典中典,不讲了。
P
树形 DP 板。算是复习了一下树形 DP?
那么对于边
答案是
Q
感觉自从了解到做类最长上升子序列还可以用树状数组做以后就彻底摒弃了二分做法。反正复杂度都一样而且树状数组更好理解不是?
这道题仍然是类最长上升子序列,设
那么用树状数组维护,不太好讲转移,放个代码:
for(int i=1;i<=n;i++){ dp[i]=qy(a[i]-1)+w[i];// 表示从 a[j]<a[i] 的 j 中选出权值最大的那一个 qy(a[i]-1), 然后加上选 a[i] 的贡献 w[i] upd(a[i],dp[i]);// 插入 }
注意树状数组的 map
维护因为
R
第一眼:这不是随便转移吗?若
第二眼:啊?
第三眼:哦!矩阵快速幂优化 DP!
题目甚至十分贴心的把转移矩阵都输给你了,赞美良心出题人。
设输入矩阵为
这个转移还是不难想到的吧。
S
一眼数位 DP 板子。算是复习了数位 DP 的记搜方式?
随便记搜,
另:如果不判前导 0 标记的话最后答案要 -1,因为 0 是不能被算在内的。
T
联赛考过加强版(有一个建模转化),好活。
似乎又是考察优化 DP?
那么易得转移:
- 若
<
,那么 。 - 否则
。
前缀和优化即可将复杂度从立方级别转化为平方级别。
U
看到数据范围
那么设
现在考虑如何求解
另:枚举子集有一个高效的方式 for(int j=i;j;j=(j-1)&i)
,表示枚举
Y
计数 DP 模板题,蓝书 0x5C 节例题 1。之前一直想在洛谷上找原没找着来着。
技巧类似,找准基准点。
首先发现
那么我们设第一个走到的点为基准点。可以设
我们又知道:从一个长、宽分别为
总结
是一个不错的板刷各种 DP 的综合专题。
本文作者:xuchuhan
本文链接:https://www.cnblogs.com/xch0730/p/18668676
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步