闲扯
这道题在考场上肝了好久,结果没肝出来,弄得自己心态有点炸,导致后面的时间分配出了问题。
今天再来做一下,在题解的帮助下弄了好久终于搞懂了。。。
题面
Solution
这道题在考场上我就有一个想法,记录一个 $dp_{i,j,k}$ ,表示考虑了前 $i$ 行,一共选了 $j$ 个,其中我们钦定的一列选了 $k$ 个。
这显然是 $O(n^3m)$ 的,可以拿到 $84$ 分的好成绩,结果最后死没改出来,只好拿了 $32$ 分的暴力走人。。。
先说 $O(n^3m)$ 怎么做。
我们重新定义一个 $dp$ 状态,我们设 $dp_{i,j,k}$ 表示考虑前 $i$ 行,其中我们钦定的那一列选了 $j$ 个,其他的选了 $k$ 个。
那么显然,我们有如下转移方程:
其中 $s$ 是我们钦定的那一列, $sum_i$ 表示第 $i$ 行的和。
我们只需要在最开始枚举一下 $s$ ,即可进行 $n^3$ 的 $dp$ 。
然后用一个 $O(n^2)$ 的 $dp$ 求出总的方案数。
设 $f_{i,j}$ 表示前 $i$ 行,选了 $j$ 个的方案数。
我们有 $dp_{i,0}=1,dp_{i,j}=dp_{i-1,j}+dp_{i-1,j-1}*sum_i$ 。
最后的答案就是 $\sum_{i=1}^n f_{n,i}-\sum_{j>k}dp_{n,j,k}$ 。
考虑优化转移。
考虑到我们只关心最后 $j,k$ 的相对大小,我们可以修改一下 $dp$ 状态。
我们设 $dp_{i,j}$ 表示考虑前 $i$ 行,其中 $j-k$ 的差值为 $j$ 的方案数。(这里的 $j-k$ 指的是前一个 $dp$ 中的值)
那么我们有:
这样就可以 $O(n^2m)$ 解决这道题了。
Code
1 |
|