Codeforces Round 584 - Dasha Code Championship - Elimination Round
2400 评分
大意
n*m
的数字矩阵
你可以对任意个列,进行列的循环移动任意次 (cyclical shifts)
问 能得到的((每行最大值之和)的最大值)是多少
数据范围
1<=n<=12, 1<=m<=2000
0<=矩阵中的数字<=100'000
3s
256MB
题解
其实还有题目E1,也就是n最大只有4
显然 我们按照每列最大元素 进行排序,只需要取最大的min(n,m)列,再旋转即可
那么问题来了,问题简化为 最大 12*12
的矩阵
如果有一个12*12
要怎么做呢
无脑枚举可以做E1,因为只有 4^4
,而E2有 12^12
方法是 dp, 状态dp[i][state]
其中 state是 选取的行的状态二进制编码 O(2^n),
整个dp表示 前i列,行的选取状态为state时的最大值
那么答案为 dp[m-1][(1<<n)-1]
状态转移
dp[i][stateX] = max(dp[i-1][stateY]+ sum{矩阵第i列,stateX-stateY选中的行的元素的值 } )
意义就是 前i列 选取行的状态是stateX的话
那么 它的最大期望 是 选取的一部分(stateX-stateY)来自第i列,其余(stateY)来自前i-1列
那么状态转移,对当前列 循环n次移动,每次计算 所有状态, 的所有状态来源
一次状态转移时间复杂度为 O(n(shift移动当前列) * (1<<n)(所有状态) * n(每个状态的来源) )
总的一次状态转移为 O( min(n,m) * n * (1<<n) * n )
12^3*2^12 = 7077888
有注意常数的必要
代码
1 |
|
本题另外一个点
max(每一行取最大值的和) = max(每一行任意取一个值的和)