CSP-2019 Emiya家今天的饭 笔记

CSP-2019 Day2 T1 几乎爆零
谁叫自己本来就笨还不怎么会DP

形式化描述这题:
给定一个 \(N\times M\) 的矩阵 \(m\),每一个元素都会有 \(m_{i,j}\) 种选法,现在添加三个限制

  1. 最少选择一个元素
  2. 每一行只能选择一个元素
  3. 每一列选择的元素个数不能超过选择总数的一半(下取整)

问,在这三个限制同时满足的情况之下有多少种方案,答案对 \(998244353\) 取模

先不管别的,总方案数我们是知道的。
因为每一行只能选 \(1\) 个,设 \(sum[i]\) 为第 \(i\) 行元素值的和,那么总方案数就是 \(\prod\limits_{i=1}^{N} (sum[i]+1) -1\) (加一是因为这一行可以不选,最后减一是因为至少要选取 \(1\) 个)
然后考虑比较难一点的第三个限制。
假设我们选取了一共 \(k\) 个元素,当前列选取了 \(j\) 个,那么必须满足 \(j\le \lfloor\dfrac{k}{2}\rfloor\)
那么暴力就出来了
\(F[i][j][k]\) 表示 前 \(i\) 行中 第 \(l\) 列选取了 \(j\) 个元素,非第 \(l\) 列选取了 \(k\) 个元素

状态转移方程为 \(F[i][j][k]=F[i-1][j][k-1]\times(sum[i]-m[i][l])+F[i-1][j][k]+F[i-1][j-1][k]\times m[i][l]\)
(需要满足\(j\le k\))

枚举第 \(l\) 列,嵌套枚举 \(i\),嵌套枚举 \(k\),嵌套枚举 \(j\),时间复杂度高达 \(O(MN^3)\),要优化.

怎么优化呢?

咕咕咕

猜你喜欢

转载自www.cnblogs.com/ShadderLeave/p/12940365.html