CF1209E2 Rotate Columns (hard version)

该博客详细介绍了CF1209E2问题的硬版本,通过缩小数据范围,发现当列按最大值排序后,只需考虑前n列即可求得最大总和。博主将问题转化为每行最多选择一个数,然后利用动态规划 dp[i][s] 表示处理到第i列,行选择状态为s的情况。通过对旋转情况下的子集总和最大值预处理,博主提出了一种O(tn^3n)时间复杂度的解决方案。
摘要由CSDN通过智能技术生成

一、题目

点此看题

二、解法

首先可以缩小数据范围,你会发现如果将每一列按最大值排序,那么 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)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值