洛谷 P8321
给定长度为 \(n\) 的序列 \(a, b\)。\(p\) 时一个长度为 \(n\) 的排列,令 \(f_(p) = \prod\limits_{i = 1}^n min(a_i, b_{p_i})\)。求 \(\left(\dfrac{1}{n!}\sum\limits_p f(p)\right) \bmod 998244353\)。
\(1 \le n \le 5000\)。
其实就是 \(a_i, b_j\) 之间配对。我们只需要碰到 \(a_i, b_j\) 较小的一个再计算贡献即可。所以可以把 \(a, b\) 混在一起得到 \(c\),从大到小排序。
设 \(dp_{i, j}\) 表示考虑到了第 \(i\) 个数,配了 \(j\) 对的答案。前缀和不难计算出前面还有多少个 \(a_x, b_y\) 没有配对 \(cnt_a/cnt_b\),分 \(c_i\) 应该和 \(a / b\) 配以及是前面的还是后面的(后面的延后算。),和前面配对的算贡献,根据 \(c_i\) 和 \(cnt_a, cnt_b\) 转移到 \(dp_{i + 1,j + 1}\) 即可。
时间复杂度:\(O(n^2)\)。
运用了延后贡献的思想,在贡献确定的时候再计算,根据延后计算时需要的信息设计状态,进行 DP 即可(这个题只关心 \(cnt_a, cnt_b\),发现只用 \(i, j\) 就可以得到)。
浙公网安备 33010602011771号