codeforces1209E2 状压dp,枚举子集
题意
给一个n行m列的矩阵,每一列可以循环移位,问经过任意次移位后每一行的最大值总和最大为多少。
分析
每一行的最大值之和最大,可以理解为每一行任意选择一个数使它们的和最大。
设\(dp[i][S]\)为前i列,已经确定值的行集合为S时,和的最大值。答案为\(dp[m][(1<<n)-1]\),
设\(f[i][S]\)为第i列循环位移任意次后选择元素所在行构成的集合为S的最大值,可以预处理出。
枚举第i+1列循环位移的次数和第i+1列选择哪些元素(枚举子集)计入答案来转移。
转移方程为\(dp[i][S]=max(dp[i-1][S']+f[i][S-S'],dp[i][S]),S'为S的子集\)。
复杂度为\(O(T*m*(2^n*n^2+3^n))\),显然过不了,实际上我们只需要考虑每列最大值最大的前n列,因为选择其他列不如替换成这n列中还没用的列。这样复杂度就能降到\(O(T*n*(2^n*n^2+3^n))\)。
Code
#include<bits/stdc++.h>
#define fi first
#define se second
#define pb push_back
#define lson l,mid,p<<1
#define rson mid+1,r,p<<1|1
#define ll long long
using namespace std;
const int inf=1e9;
const int mod=1e9+7;
const int maxn=1e5+10;
int t,n,m,a[15][2010],dp[15][1<<13],r[2010],b[2010],f[15][1<<13];
int cmp(int x,int y){
return r[x]>r[y];
}
int main(){
//ios::sync_with_stdio(false);
//freopen("in","r",stdin);
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(int i=0;i<m;i++) r[i]=0,b[i]=i;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&a[i][j]);
r[j]=max(r[j],a[i][j]);
}
}
sort(b,b+m,cmp);
m=min(n,m);
for(int i=0;i<m;++i){
for(int j=0;j<(1<<n);++j){
int u=0;
for(int k=0;k<n;++k){
int ret=0;
for(int l=0;l<n;++l) if((j>>l)&1) ret+=a[(l+k)%n][b[i]];
u=max(u,ret);
}
f[i][j]=dp[i][j]=u;
if(i==0) continue;
for(int k=j;k;k=(k-1)&j) dp[i][j]=max(dp[i-1][k]+f[i][j-k],dp[i][j]);
}
}
printf("%d\n",dp[m-1][(1<<n)-1]);
}
return 0;
}
codeforces1209E2 状压dp,枚举子集的更多相关文章
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
- 计蒜客习题:蒜头君的积木 (状压DP 枚举子集)
问题描述 蒜头君酷爱搭积木,他用积木搭了 n 辆重量为 wi的小车和一艘最大载重量为 W 的小船,他想用这艘小船将 n 辆小车运输过河.每次小船运载的小车重量不能超过 W.另外,小船在运载小车时,每辆 ...
- BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)
(Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...
- UVA 11825 Hackers’ Crackdown 状压DP枚举子集势
Hackers’ Crackdown Miracle Corporations has a number of system services running in a distributed com ...
- 洛谷P3959 宝藏(NOIP2017)(状压DP,子集DP)
洛谷题目传送门 Dalao的题解多数是什么模拟退火.DFS剪枝.\(O(3^nn^2)\)的状压DP之类.蒟蒻尝试着把状压改进了一下使复杂度降到\(O(3^nn)\). 考虑到每条边的贡献跟它所在的层 ...
- 牛客练习赛49 B 筱玛爱阅读 (状压DP,子集生成)
链接:https://ac.nowcoder.com/acm/contest/946/B 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262875K,其他语言5257 ...
- HDU 5657 CA Loves Math 状压DP + 枚举
题意: 给出\(A(2 \leq A \leq 11), n(0 \leq n \leq 10^9), k(1 \leq k \leq 10^9)\). 求区间\([1, A^n]\)中各个数字互不相 ...
- uva 11825 Hackers' Crackdown (状压dp,子集枚举)
题目链接:uva 11825 题意: 你是一个黑客,侵入了n台计算机(每台计算机有同样的n种服务),对每台计算机,你能够选择终止一项服务,则他与其相邻的这项服务都终止.你的目标是让很多其它的服务瘫痪( ...
- UVALive 4794 Sharing Chocolate(状压,枚举子集)
n的规模可以状压,f[x][y][S]表示x行,y列,S集合的巧克力能否被切割. 预处理出每个状态S对应的面积和sum(S),对于一个合法的状态一定满足x*y=sum(S),实际上只有两个变量是独立的 ...
随机推荐
- python学习-6 猜拳小游戏
import random # 调用随机数模块 pc = random.randint(1,3) # 产生1-3的随机数 print("来玩个猜拳游戏吧!") a = '石头' b ...
- Pycharm超级好用的快捷键——效率之王
Pycharm超级好用的快捷键--效率之王 IT界老黑 IT界老黑 带你领略Python的魅力 关注他 270 人赞同了该文章 最重要的快捷键 ctrl+shift+A:万能命令行 shift两次: ...
- Go-环境搭建-hello world-变量常量定义-函数使用基础
目录 编程语言科普 常见语言的背景 go 为什么这么火? 环境搭建(很重要) ide 编辑器 注释 第一个程序 Hello world! 编译与执行 变量类型 数字类型 字符串类型 布尔类型 常量 函 ...
- MACD中短线交易系统
1.MA5.MA10金叉,且股价收盘站稳5日均线 2.MACD金叉 3.MACD红绿柱 a.MACD红柱发散,表示多头力量增强,此时买入或加仓 b.MACD红柱收缩,表示多头力量减弱,此时卖出或减仓 ...
- Abp 聚合测试
Abp 官网开始的教程例子,是IRpositoty<entity> 直接出现在应用层.但是如果是一个聚合根也会这样吗? 那么聚合根是访问仓储的最小单元,要通过聚合根来操作业务,就是实体, ...
- c#如何使用MemoryStream和BinaryFormatter进行对象的序列化和返序列化
1 下面是我写的一个序列化的类 public static class ObjSerialize { /// <summary> /// 将对象数组obj序列化,内存中的缓冲区的数据序列化 ...
- 如何提高后台服务应用问题的排查效率?日志 VS 远程调试
转眼间,距离Jerry最近一篇文章推送已经过去了一个多月的时间了. 公众号更新的频率降低,不是因为Jerry偷懒,而是由于从春节过后,我所在的SAP成都研究院数字创新空间整个团队,一直在忙一个5月份需 ...
- 使用ABAP批量下载Markdown源文件里的图片到本地
执行我github里的这个report: 选中一段markdown文档,ctrl C: 然后直接执行report: 执行完毕: 所有文件都下载到本地文件夹: 这个report使用到的工具类:zcl_c ...
- 文件 file open函数的打开及 函数的调用
文件 mode 模式字符的含义 字符 含义 'r' 以只读方式打开(默认) 'w' 以只写方式打开,删除原有文件内容(如果文件不存在,则创建该文件并以只写方式打开) 'x' 创建一个新文件, 并以写模 ...
- Servlet和JSP学习总结
目录 Jsp会被编译成servlet,在页面被第一次访问的时候 Jsp中可以在html页面中嵌入java代码或者引入jsp标签 可以在html中引入自定义标签 Web工程的目录结构 Jsp的注释 Js ...