背包 dp .
如果直接裸上一个背包计数,那么阵营和派系两种限制的状态都要记录.
即,设 $f(i,x,y)$ 表示考虑了前 $i$ 个城市的所有学校,加入蓝阵营的有 $x$ 人,加入鸭派系的有 $y$ 人的方案数.
时间复杂度 $O(nm^2)$ ,无法通过.
注意到有限制的学校数目 $k$ 比较小,可以将有限制的学校和没有限制的学校分开处理.
设 $f(i,x,y)$ 表示考虑了前 $i$ 个包含某个有限制学校的城市,加入蓝阵营的有 $x$ 人,加入鸭派系的有 $y$ 人的方案数.
而对于没有限制的学校,可以发现学校选择的派系是不影响城市选择的阵营的,可以分开 dp ,最后将方案数相乘.
设 $g(i,x)$ 表示考虑了前 $i$ 个没有限制学校的城市,加入蓝阵营的有 $x$ 人的方案数.
设 $h(i,y)$ 表示考虑了前 $i$ 个没有限制的学校,加入鸭派系的有 $y$ 人的方案数.
最后统计答案时,每个 $f(x,y)$ 对应的合法的 $g,h$ 都是一段区间,处理出前缀和后即可统计贡献.
时间复杂度 $O(10\cdot k^2m+nm)$ .
1 | //%std |