2019.8.14 金华正睿集训总结Day18

本文深入探讨了动态规划(DP)的经典问题与进阶挑战,包括背包问题的不同变体,如01背包、完全背包及多重背包,以及树形DP、区间DP和状态压缩DP的应用场景。同时,文章涵盖了数位DP、特殊序列操作、图论中的valley问题、独立集计数等复杂案例,旨在全面解析DP算法的精髓。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

8.14

快不行了。

DP

经典背包问题

• n个物品,每个物品有重量 w[i],求选出重量量和不超过 S 物品集合的方案数

• 01背包:每个物品最多选⼀次

• ⽆限背包(完全背包):每个物品可以选无数次

• 多重背包:每个物品最多选 k[i] 个

进阶背包问题1

• 考虑01背包问题,有 Q 种操作,每次加入一种物品或删除一种物品,每次操作完后输出不超过 S 的⽅方案数

• n,Q,S<=2000

进阶背包问题2

• 树上依赖 01 背包:如果儿子选了,则父亲必须要选

进阶背包问题3

• 有 n 种物品,第 i 种物品重量为 i,且有无限个

• 现在每次询问 (R,S),表示选不超过 R 个物品使得重量为 S的方案数

• S<=n<=5000

• R<=5000

进阶背包问题4

• 有 i 种物品,第 i 种物品最多选 i 个,且重量为 i,求选一些物品使得重量之和为 n 的方案数

• n<=100000

进阶背包问题5

• 有 n 个物品,每个物品有价值 w[i],体积 v[i],个数d[i]

• 求体积为 S 的背包最多可以装下多少价值的物品

• 1<=n, v[i]<=80, 1<=w[i],d[i],S<=10^9

经典树形DP

• 如何用树形DP求直径

• 求每个点到其他点的距离之和

• 求每个点到其他点的最长路径

• 求树上一个点权和最大的独立集

• 求树上有几个⼤⼩不超过 K 的独立集 (K<=500)

经典区间DP1

• 给定一个长度为 n 的字符串 S ,求最少插入多少字符串使得他能变成回文串

• n<=5000

经典区间DP1.5

• 给定一个字符串 S,求它的回文子序列个数

• n<=5000

经典区间DP2

• 有一个 n 个元素的序列 a,你每天可以从两端中任意取一个数,第 i 天取出的数 w 对答案的贡献为 i*w,求最大化取完时的贡献和

• n<=5000

经典区间DP3

• 有 n 个石子,第 i 个的大小为 w[i],每次可以合并相邻两个,得到他们两个大小之和的代价,且他们会并成一个新的石头,新的石头的大小是旧的两个的大小的和

• 求最大的代价之和

• n<=300

经典区间DP4

• 有 n 个数,取走一个数的代价是它乘上它相邻的两个数,开头和结尾不能取,要求你取到只剩2个数为止,求最小代价和

• n<=300

进阶区间DP1

• 给⼀个序列列 a[1…n],每次可以拿走连续一段相同的数,拿完后序列会并起来

• 求最少几次把整个序列拿完

• n<=100

进阶区间DP2

• 在数轴 [0,L] 上,有 n 个point,第 i 个的坐标是 Xi,且有个冷却时间 Ti

• 一开始你在位置 0,时间从 0 开始记录,每次你可以花费一单位的时间向左或向右移动一格

• 你的目标是激活所有 point 然后回到位置 K,激活一个 point只需要⾛到它脸上即可,不需要花费时间,但是必须在 Ti 秒后才能被激活

• 求最短的时间, L,n,K<=1000, Ti<=30000

基础状压DP1

• 给定一张⽆向图,每个点可能是⾼点或者低点,三个点(x,y,z)被称为⼀一个valley当且仅当 x,z 是高点, y是低点,且存在边(x,y)和(y,z)

• 现在要求最多有几个valley,每个点最多只能在⼀个valley里

• N<=30,高点数量<=15

基础状压DP2

• 求有多少⽆向图满足有n个点m条边,且每个点度数为偶数,并且对于每条边 (u,v) 都有 |u-v|<=K

• n,m<=30

• K<=8

基础状压DP3

• 给定 n 个物品,每个物品有重量 w[i],你需要将他们划分成不超过 m 个集合,使得每个集合的物品重量之和都不超过S,求方案数

• n,m<=14

基础状压DP4

• 有 n 个物品,每个重量为 w[i],现在你有很多个大小为 S的麻袋,求至少需要几个才能把他们全装进来?

• n<=20

进阶状压DP1

• ⼀个 n*m 的01矩阵,要求不能有相邻的 1 ,求方案数

• n,m<=12

奇怪的数位DP

• 给定数组 b[1…n],求有几个数组 a[1…n],满足0<=a[i]<=b[i] 且 a 的异或和为 0

• n<=100000

• b[i]<=10^18

好的,那么我们可以看到,今天讲的都是例题,题面就放这儿了,等我弄明白之后再来填坑

(表示补博客补到流泪,接下来要填昨天考试的坑了,嗯嗯)

### 关于OI集训资料和训练计划 #### 集训资料推荐 对于想要参与OI竞赛的学生来说,选择合适的资料至关重要。以下是几常见的OI集训资料: 1. **书籍** 经典的算法书如《挑战程序设计竞赛》[^1] 和《算法导论》可以作为理论基础的学习材料。这些书籍涵盖了数据结构、图论以及动态规划等内容。 2. **在线课程与平台** 可以利用一些知名的编程学习网站来提升自己的技能水平,比如洛谷、Codeforces等。通过解决平台上不同难度级别的题目,逐步积累经验并掌握各种算法技巧[^2]。 3. **历年真题解析** 学习过往比赛中的经典试题及其解答方法非常重要。例如,在提到的一篇关于2021年牛客OI赛前集训营的文章中指出,“单次Dijkstra的时间复杂度为 \(O((n+m)\log n)\)” 这一知识点可以帮助理解最短路径题的有效求解方式。 4. **总结文章** 来自其他参赛者的经验和教训同样宝贵。“OI集训总结”分享了一位选手的心路历程:“为了不辜负这四年的OI学习生涯”,表达了坚持到底的决心;而另一份针对普及组的比赛总结则强调了实际操作过程中需要注意的具体事项,像“准备一个输入用的s数组,还有ans数组”的细节处理[^3]。 #### 训练计划建议 制定合理的训练计划能够帮助更好地备战OI赛事: - **短期目标设定**: 如果距离式考试仅剩下两个月时间,则需集中精力弥补短板领域的同时巩固强项。考虑到“文化课落了很多”,可能需要合理分配每天用于ACM/OI练习与其他学业复习之间的时间比例。 - **专项突破**: 对薄弱环节进行针对性强化训练。如果发现自己在某些特定型的题目上总是遇到困难(如贪心策略或者网络流),就应该多花些功夫去研究这题的特点及常用解决方案。 - **模拟实战演练**: 定期参加线上或线下的模拟测试活动,熟悉考场环境氛围,并检验自己当前的真实竞技状态如何调整后续备考方向。 ```c++ #include <stdio.h> int main(){ long long n; scanf("%lld",&n); printf("%lld", n&1?(n>>1)*((n>>1)+1):(n>>1)*(n>>1)-1 ); return 0; } ``` 上述C++代码片段展示了T2提取数字的一个实现例子[^4],从中可以看出简洁高效的编码风格也是成功完成任务的关键因素之一. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值