P5289 [十二省联考 2019] 皮配
很容易想到设 \(dp_{i,j,k}\) 表示考虑前 \(i\) 个阵营,\(C_0=j\),\(D_0=k\) 时的方案数,层内转移时可以用辅助数组对两种阵营决策分别转移,此时时间复杂度为 \(O(nM^2)\)。
考虑 \(k=0\) 的情况,如果我们能做这个的话,\(k=30\) 其实就是在暗示我们把特殊选手拆出来单独做。而如果所有选手都没有偏好,我们发现 \(C\) 和 \(D\) 其实是独立的,即,我们完全可以先用每个城市对 \(C\) 一维做背包,再用每个选手对 \(D\) 一维做背包,此时时间复杂度 \(O((n+c)M)\)。
到这里我们已经有了 \(70\) 分。
此时一个很自然的思路是,我们对非特殊选手用第一种做法,特殊选手用第二种做法。但特殊选手也 需要和其城市内的其它选手选到一个阵营,故我们并不能完全独立地将其拉出来做。不过考虑 \(C,D\) 既然完全独立,我们把存在特殊选手的城市也拆出来单独做不就好了嘛。
具体地,我们对于非特殊选手和不含特殊选手的城市用第二种做法做一遍,再对含特殊选手的城市及其内部的特殊选手用第一种做法做一遍,最后拼起来即可。
此时时间复杂度 \(O(kM^2)\),常数巨大,且需要滚动数组优化空间。根据常数的优化不同可以拿到 \(60\sim 90\) 的分数。
再读题,发现我们还有条件 \(s_i\le \min(M,10)\) 没用到,这样以来 \(k=30\) 时特殊选手的人数总和不会超过 \(10k\),减少枚举时间复杂度即可被优化为 \(O(k^2M)\) 带一个 \(10\) 的常数,就过了。
独立无关变量,单独处理特殊变量。