ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

CF1209E2 Rotate Columns (hard version)

2022-08-03 20:33:54  阅读:141  来源: 互联网

标签:Rotate rep hard mx CF1209E2 一列 最大值 dp define


题意

给定一个 \(n \times m\) 的矩阵,你可以对每一列进行若干次循环移位。

求操作完成后每一行的最大值之和最大是多少。

Solution

考虑到 \(n\) 的范围比较小,应该可以用状压。于是令 \(dp_{i,s}\) 表示处理完前 \(i\) 列,使 \(s\) 集合中的行的最大值已经确定的最大值和最大是多少。那么对于每一列相当于可以钦定某些行的最大值确定。

每次枚举子集然后循环位移当前列即可。这样可能会枚举到不可能的情况,但是肯定不优于最后答案,所以没关系。

然后这样复杂度就爆炸了。

然后贪心的想,最优策略肯定是每一列取其最大值就好。于是对每一列按其最大值排序,然后取前 \(n\) 个做就行了。

Code

// Problem: CF1209E2 Rotate Columns (hard version)
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/CF1209E2
// Memory Limit: 2500 MB
// Time Limit: 250000 ms

#include<bits/stdc++.h>
#define ll long long
#define inf (1<<30)
#define INF (1ll<<60)
#define pb emplace_back
#define pii pair<int,int>
#define mkp make_pair
#define fi first
#define se second
#define all(a) a.begin(),a.end()
#define siz(a) (int)a.size()
#define clr(a) memset(a,0,sizeof(a))
#define rep(i,j,k) for(int i=(j);i<=(k);i++)
#define per(i,j,k) for(int i=(j);i>=(k);i--)
#define pt(a) cerr<<#a<<'='<<a<<' '
#define pts(a) cerr<<#a<<'='<<a<<'\n'
// #define int long long
using namespace std;
const int MAXN=2010;
int n,m;
struct Col{
	int a[15],mx;
	bool friend operator<(Col x,Col y){
		return x.mx>y.mx;
	}
}c[MAXN];
int dp[15][(1<<12)+5],mxc[(1<<12)+5];
void solve(){
	cin>>n>>m;
	rep(j,1,m) c[j].mx=0;
	rep(i,1,n) rep(j,1,m){
		cin>>c[j].a[i];
		c[j].mx=max(c[j].mx,c[j].a[i]);
	}sort(c+1,c+1+m);
	memset(dp,0,sizeof(dp));
	rep(i,1,min(n,m)){
		rep(j,0,(1<<n)-1){
			mxc[j]=0;
			rep(dlt,0,n-1){
				int sum=0;
				rep(k,1,n) if(j&(1<<(k-1))) sum+=c[i].a[(k+dlt-1)%n+1];
				mxc[j]=max(mxc[j],sum);
			}
		}
		rep(j,0,(1<<n)-1){
			dp[i][j]=max(dp[i][j],dp[i-1][0]+mxc[j]);
			for(int sj=j;sj;sj=(sj-1)&j){
				int st=j^sj;
				dp[i][j]=max(dp[i][j],dp[i-1][sj]+mxc[st]);
			}
		}
	}cout<<dp[min(n,m)][(1<<n)-1]<<'\n';
}
signed main()
{
	ios::sync_with_stdio(0);
	cin.tie(0);cout.tie(0);
	int T;for(cin>>T;T--;)solve();
	return 0;
}

标签:Rotate,rep,hard,mx,CF1209E2,一列,最大值,dp,define
来源: https://www.cnblogs.com/ZCETHAN/p/16548601.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有