2019 年电子科技大学 ACM-ICPC 暑假前集训动态规划专题解题报告
8/12/13
我 J 真的写不出来了……
A. oy 环游世界
题目描述
有
数据范围:
题解
TSP 板子,但是与 TSP 的唯一区别是不需要回到起点,稍微改动一下即可。
记
记
时间复杂度
代码见这里
B. 挖矿攻略
题目描述
数据范围:
题解
考虑对于一个点的转移,如果这个点点权选择向左传递,那么它左边的点均向左转移,否则,它上面的的点均向上转移。这是一种贪心的思路,如果在传输过程中转换传递方向,将会丢失一种点权中的一部分,这比全部取同一种点权要劣,因此这种贪心是可行的。
记
对于两个求和式,可以利用前缀和优化转移,降低时间复杂度。
时间复杂度
(其实感觉不用优化转移
原题详见:Luogu 2780. 狗哥采矿
代码见这里
C. 手办
题目描述
有
数据范围:
题解
注意到手办数较多,但高度种类很少,可以考虑对高度进行状压 DP。考虑到一个性质,如果序列中存在一个手办与要插入的手办高度相等,则可以把这个手办插入到序列中与这个手办高度相等的手办旁边,这样不影响答案,否则为了避免插入影响到已有段的连续性,只能放在后面或两相邻段中间,但是答案总是加一。于是,我们可以采用先用 DP 计算抽取过后剩余序列的最小混乱度,再把手办补回来更改答案的方式解决这个问题。
据此,设状态
第
个手办和第 个高度相同,则: 第
个手办和第 个高度不同,且被抽掉,则:
- 第
个手办和第 个高度不同,但没被抽掉,则:
其中
最后,枚举 __builtin_popcount()
函数。注意到 DP 方程只与前一个位置有关,因此可以利用滚动数组优化空间。
时间复杂度
原题来自:
题外话:这道题是敝校 NOIP 训练题,但是因为偷懒当年没写,两年半后还是还了……
(悬殊的 RunID 差距……)
代码见这里
D. 序列
题目描述
给定一个长度为
数据范围:
题解
考虑这个山峰的每一半,都是求一个最长上升子序列,所以我们正着做一次 LIS,倒着做一次 LIS,然后枚举每个点,取以这个点为结尾的正向与逆向最长上升子序列长度的最小值,然后乘二减一即可。
LIS 有优秀的 lower_bound
……
时间复杂度
代码见这里
E. 神
题目描述
给定一个长度为
数据范围:
题解
考虑块内一段,最小段数为出现的字符种数,即把所有相同的字母放在一起为最优解。再考虑块间排序,可以证明,如果两块之间存在相同字母,那么这两块间答案为两块的答案和减一,最后考虑相邻三块之间的排序,如果三块都有相同字母,那么将中间一块的相同字母全部放前,放后和分开放置的答案是相同的,因此无需考虑分开放置的情况。
记
其中,
最后答案是
时间复杂度:
代码见这里
F. 苇名欧一郎
题目描述
一共有
数据范围:
题解
这道题是比较经典的拓扑序计数问题。记
其中,
时间复杂度
代码见这里
G. 子串
题目描述
给出长度为
数据范围:
题解
虽然不是数位 DP 但是可以用类似思路解决。记
注意先需要将所有长度为
最后答案是
注意到这道题 vector
嵌套或者开成一位数组,通过计算将二维数组的坐标映射到一位数组上。
帮着测出了数据范围有问题的能不能给点加分啊
时间复杂度
(当然通过滚动数组和动态开数组可以做到
代码见这里
H. van 游戏
题目描述
树上有权值,两人在树上博弈,一个人的策略是保证自己获得的权值尽可能大的情况下,对方获得尽可能小的权值,另一个人的策略是保证对方获得权值尽量小的情况下,对方获得尽可能大的权值。求最后两人获得权值之和。
数据范围:
题解
看到博弈论就不想做的就是我了……
首先看上去是树形 DP,再看一眼确实是树形 DP。
记
需要注意的是,当用搜索写树形 DP 时需要注意选择的人和这一层是谁拿的恰好相反。
时间复杂度
代码见这里
I. 攻略妹纸
题目描述
有
数据范围:
题解
如果去掉这个附加限制,就是一个 01 背包。
考虑这个附加限制,显然对于
注意数据范围要开 long long
……
时间复杂度:
代码见这里
J. 扫广场
题目描述
下一站,下一站,是人民扫广场
给出一个
数据范围:
题解
五进制状压加优化我佛了,插头 DP 显然过了。
数据十分有毒,我第一遍 WA5 之后改了个大 bug 之后 WA4,调完 WA1……
我也不知道 cjj Sugarrr 两位神仙怎么 A 过去的,LoliconAutomaton 说想写网络流但是不知道怎么建源汇点,我也想网络流但是感觉有毒,Decision 大爷 WA8 之后可能是被我数据毒到了,我写了九个小时啥用没有心态是真的炸了……
不知道以后会不会补,反正先这样吧……
已知 10203040
这样,因此我们采用五进制状态压缩,把所属连通分量的编号作为状态,还有 0
作为这个格子被占用的情况。
然后对于每一行,枚举上一行状态和这一行状态,如果匹配合法则进行转移。就是这里判断合法十分难受,有很多特殊情况,还有全 0
的情况,第一行情况,我可能是这里写炸了就不说了……
但是这样复杂度就炸了,枚举行
注意到 10203
和 10302
这两个状态是本质相同的,11223344
这样的状态是本身不合法的,因此存在很多无用状态,我们可以把它们剪掉。出题人 oydy 剪到了不到
但是这样复杂度就不炸了,就可以尽情 WA on 1 了……
最后发现我构造状态像 cxk,直接枚举每个五进制状态然后判断一下合不合法就完事的事情被我硬生生的搞成了一个暴搜,还搜不出来最优的……
实际上最后一次改的匹配合法状态和生成下一行状态是对的但是直接被我删了还没留备份……
时间复杂度
代码见这里
K. 抽卡
题目描述
玄学抽卡,每次有
数据范围:
题解
看题来说,能猜到是矩阵快速幂优化概率 DP,并且能猜到复杂度是
可以把单抽奇迹的情况考虑成一次补齐所有碎片,记
对于
对于
于是我们将其写为矩阵,记为
DP 矩阵如下:
其实 DP 矩阵只是一个列向量,但是为了偷懒矩阵乘法不想写那么多于是扩展成
这样答案就是
读入为了避免精度误差直接用整数形式读入,也不用最后乘
感谢出题人没出
时间复杂度
代码见这里
L. zh 的奖杯
题目描述
给了
数据范围:
题解
对于这道题,有一个显见的 DP 转移方程。记
其中,
易知,这个状态转移得到的 DP 时间复杂度为
继续观察转移方程,令
很朴素的想法是,只要
网上其实有很多证明黄学长也写过但是不想打唉算了还是打吧
下面考虑证明这一决策单调性,假设
对于决策单调性,需证对所有
由已知,
左右两边展开,得:
由于
现在的关键就是怎么利用决策单调进行转移。
我们将第一个不等柿平方打开:
移项,将
这就是
根据决策单调性,我们可以维护一个单调队列来维护
题外话:先卡精度,然后加大数据范围之后爆 long long
了,但是过了……
原题来自:HNOI 2008. 玩具装箱
时间复杂度
代码见这里
M. 崭新龙狙,制霸全区
题目描述
记
数据范围:
题解
典型数位 DP,考虑
考虑记忆化搜索,记状态
每当枚举到
这是第二次写数位 DP……
时间复杂度
代码见这里