2024.8.30 总结(集训 考 DP)

上午三个多小时考四道题的 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

posted @ 2024-08-30 22:56  huangkxQwQ  阅读(8)  评论(0编辑  收藏  举报