一、题目
二、解法
首先可以缩小数据范围,你会发现如果将每一列按最大值排序,那么 m m m较大时取前 n n n列算答案即可。
要将题目求的东西做一个转化,每一行的最大值转化成每一行至多选一个数(反正要求总和最大),这样就一定会选每一行的最大值。设 d p [ i ] [ s ] dp[i][s] dp[i][s]为处理到了第 i i i列,行是否选了数的状压为 s s s。
转移要预处理算出旋转情况下的子集总和最大值,这一列的一个状态 j j j旋转 d d d次得到的状态是((j>>d)|(j<<n-d))&((1<<n)-1)
,那么在 d d d取 [ 0 , n ) [0,n) [0,n)时找最大值即可。转移过程枚举子集的子集,所以时间复杂度 O ( t n 3 n ) O(tn3^n)