上午三个多小时考四道题的 DP。
赛时会的分:[100](?) + 100 + [30](?) + 100。
估分:100 + 100 + 0 + 100。
实际分:10 + 100 + 0 + 100。
挂巨量的分,挂了 120 分。
下面是一些值得注意的点:
T1
就是分组背包。DP 数组下标要考虑负数可以直接全体加一个值变成非负的,[或者用 map 之类的](?)(& 不知道 unordered_map 会不会被卡)。
我赛时的做法是每个挂钩的位置加上 15 变成非负的,然后最后要看质量之和 * 15 的地方的 DP 值。感觉可能是对的,不知道为啥挂了。
T2
数位 DP 的基础题,做法比较板。
注意 0 算不算贡献;注意是 < x 还是 <= x;注意 dig 数组不是输入的字符串(代表数),而是那个字符串的 1 ~ ... 位翻转后的结果(就是要注意是从低位到高位存的还是从高位到低位存的)。
对于要不要用高精度,可能可以先写一份用 long long 之类的的代码,然后拿它跑极限数据看会不会爆 long long。但是这样会不会爆成负数又加回正数从而导致判断失误啊?
T3
感觉是非常巧妙的背包题。
数据范围较小,想:
- 状压
- 搜索
- 高维 DP
此题即高维 DP。
有序枚举颜色来填以满足第一种限制(同一行的两个相邻点,左点的颜色 <= 右点的颜色)。此处我从小到大枚举颜色。
设 \(f _ { i, a, b, c, d }\) 表示当前填了第 \(0\) 到 \(i\) 个颜色,\(4\) 行分别填到第 \(1\) 位到第 \(a, b, c, d\) 位的方案数。
现在考虑第二种限制怎么满足。假设要求 \(a\) 处理的行上的第 \(x\) 位和 \(b\) 处理的行上的第 \(y\) 位颜色相同。那么填某一种颜色后,要么 \(a < x\) 且 \(b < y\),要么 \(a \geq x\) 且 \(b \geq y\)。那么可以预处理出哪些状态是不能要的,每一种颜色填完后就把这些状态的方案数赋为 0。
那么现在考虑怎么转移。考虑一位一位转移,外层循环枚举颜色,内层枚举转移哪一行的哪一位,像完全背包那样转移。[本质是高维费用的完全背包,每一个物品是在某一行往右多填一位,费用是 1。](?)于是可以把 \(i\) 那一维去掉。
[std](?)的代码写得很好看。可以参考。我补的代码也是这种写法。
启发:这种多个并列的东西(如本题中的 \(4\) 行),可以考虑高维 DP,每个开一维。
T4
题解好像是状压 DP,用矩阵快速幂来优化。[感觉和我的本质上应该差不多。](?)
我的做法:
两行为一个状态,把状态作为点,根据合法转移在状态之间连边,用邻接矩阵记录,跑邻接矩阵的快速幂再统计答案即可。不管不合法的状态来节省时空。
启发:这种状态转移求路径数的 DP 可以转换成图论题用邻接矩阵快速幂做。
2024.8.30
标签:颜色,2024.8,30,long,DP,100,高维 From: https://www.cnblogs.com/huangkxQwQ/p/18389646