「CF1209E2」Rotate Columns (hard version)

Description

Link:CF1209E2

给出一个 n×mn \times m 的矩阵 aa

你可以进行若干次操作。每次操作,你可以选择任意一列,并循环移位该列中的元素。

rir_i 表示第 ii 行的最大值,求 i=1nri\sum_{i = 1}^n r_i 的最大值。

数据范围:1n121 \leq n \leq 121m20001 \leq m \leq 20001ai,j1051 \leq a_{i, j} \leq 10^5

时空限制:33s / 512512MiB。

Solution

真正有效的列,一定在列最大值前 nn 大的那些列之中。容易使用反证法证明。

考虑一列一列处理,在每一列中钦定有哪些位置为对应行的最大值。由于此题要求的是最大值之和的最大值,故在统计答案的过程中,我们不必保证每次钦定的最大值一定是真实的最大值。因为不成立的一定不优

f(j,S)f(j, S) 表示考虑到了前 jj 列,其中每行的最大值确定状态为一个二进制数 SS(若 SS 的第 ii 位为 11,则表示第 ii 行的最大值已经确定),则有

f(j,S)=maxTS{f(j1,T)+value(j,ST)}f(j, S) = \max\limits_{T \subseteq S} \{ f(j - 1, T) + \mathrm{value}(j, S \setminus T) \}

其中 value(j,S)\mathrm{value}(j, S) 表示第 jj 列中,所有行号属于 SS 的位置,在 0n10 \sim n - 1 次循环移位下元素之和的最大值。

时间复杂度 O(n3n+n22n)\mathcal{O}(n3^n + n^22^n)