首页 > 其他分享 >CF1209E2 Rotate Columns (hard version)

CF1209E2 Rotate Columns (hard version)

时间:2024-04-25 13:11:07浏览次数:20  
标签:Rotate val int 复杂度 hard cin CF1209E2

题意:

题目

分析:

首先我们看看数据范围: \(n<=12\) 这很显然是一个十分小的一个范围,提示我们可以使用各种怪解时间复杂度较大的解法去做。

先不考虑 \(m\) 的数据范围,我们可以很显然的想出一个状压 dp:

设 \(f[i][s]\) 考虑到第 \(i\) 列时,是行状态为 \(s\)(就是考虑哪些行计入答案)时,答案的最大值。

那么我们可以枚举当前列所选行的状态 \(s_0\) ,那么肯定满足 \(s_0\) 为 \(s\) 的子集。

设 \(val[i][s]\) 为第 \(i\) 列 行状态为 \(s\) 时的贡献最大值。

则显然有:\(f[i][s]=\max(f[i][s],f[i-1][s \oplus s_0]+val[i][s_0])\)

val 很容易在 \(O(2^n m n^2)\) 中解决。

但是递推的过程时间复杂度高达 \(O(3^nm)\),会炸。

所以我们考虑优化。

这里有一个贪心:

当 \(n<m\) 时,只有列中元素最大值前 \(n\) 个的列可能对答案有贡献。因为假如有其他的列对答案有贡献,那么一定可以被未被选中的前 \(n\) 列中的一个最大值所替换,答案显然可以更优。

所以此时 \(m\) 的数据规模就和 \(n\) 一样了。

代码:

#include<bits/stdc++.h>
using namespace std;

const int N=13,M=2000+10;
int a[N][M],n,m;
int maxcol[M],rk[M];
int f[N][(1<<N)+10],val[N][(1<<N)+10],tmp[N*2];

void init(){
	memset(maxcol,0,sizeof maxcol);
	memset(f,0,sizeof f);
	memset(val,0,sizeof val);
	for(int i=1;i<=m;i++)rk[i]=i;
	return;
}

bool cmp(int x,int y){
	return maxcol[x]>maxcol[y];
}

signed main(){
	std::ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--){
		cin>>n>>m;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				cin>>a[i][j];
			}
		}
		init();
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				maxcol[j]=max(maxcol[j],a[i][j]);
			}
		}
		sort(rk+1,rk+m+1,cmp);
		m=min(n,m);
		for(int id=1;id<=m;id++){
			int i=rk[id];
			//cout<<i<<" ";
            for(int j=1;j<=n;j++){
            	tmp[j]=tmp[j+n]=a[j][i];
			}
			for(int s=0;s<(1<<n);s++){
				for(int j=1;j<=n;j++){
					int cnt=0;
					for(int k=1;k<=n;k++){
						if((1<<k-1)&s){
							cnt+=tmp[k+j-1];
							//cout<<id<<" "<<s<<" "<<tmp[k+j-1]<<endl;
						}
					}
					val[id][s]=max(val[id][s],cnt);
				}
				//cout<<id<<" "<<s<<" "<<val[id][s]<<endl;
			}
		}
		for(int i=1;i<=m;i++){
			for(int s=0;s<(1<<n);s++){
				//cout<<f[i][s]<<endl;
				f[i][s]=f[i-1][s];
				for(int s0=s;s0;s0=(s0-1)&s){
					f[i][s]=max(f[i][s],f[i-1][s^s0]+val[i][s0]);
				}
			}
		}
		cout<<f[m][(1<<n)-1]<<"\n";
	}

	return 0;
}
/*
1
3 3
9 9 9
1 1 1
1 1 1
*/

标签:Rotate,val,int,复杂度,hard,cin,CF1209E2
From: https://www.cnblogs.com/little-corn/p/18157448

相关文章

  • 推荐一个使用 HardLink 硬链接减少重复文件占用磁盘空间的工具
    在NTFS文件系统里面,咱可以使用HardLink硬链接的方式,将多个重复的文件链接到磁盘的同一份记录里面,从而减少在磁盘里面对重复文件存储多份记录,减少磁盘空间的占用。本文将和大家推荐我所做的基于HardLink硬链接减少重复文件占用磁盘空间的工具此工具名为UsingHardLinkToZipN......
  • Qt 从 QTransform 逆向解出 Translate/Scale/Rotate(平移/缩放/旋转)分析
    QTransform用于图形绘制,它定义了如何平移(translate)、缩放(scale)、切变(shear)、旋转(rotate)或投射(project)坐标系。注意:QTransform是作用于坐标系,不是直接作用于图形。实际运用中我们可以通过QPainter、QGraphicsView、QGraphicsItem实现图形的平移、缩放、旋转等操作,但是需要从......
  • 命令行调试logrotate
    logrotate配置文件一般存放在/etc/logrotate.d。场景1:不存在/var/lib/logrotate/status文件说明没有真正执行过logrotate。/var/lib/logrotate/status会记录上一次logrotate时间,记录的时间可能没有真正执行过。场景2:logrotate-d配置文件logrotate-v配置文件:执行logrotate......
  • T434199 「LAOI-4」Mex Tower (Hard ver.)
    /* 和上题一样只不过,是换成了检验答案,还是找规律, 自己看看吧awa*///O(n)#pragmaGCCoptimize(2)#include<iostream>#include<algorithm>#include<cstring>#include<ctime>usingnamespacestd;intn,m;strings;charget(chara,charb){ints......
  • ABC 286 C - Rotate and Palindrome
    题目链接:注意到“您可以按任意顺序执行以下两种运算零次或多次”。因此,解决这个问题的一个重要观察点是,你可以假设\(A\)操作执行了几次,然后\(B\)操作执行了几次。你也可以假设\(A\)操作最多被执行\(N\)次(因为执行\(N\)次就会使它处于原始状态)有了这个观察结果,你就......
  • Git reset 中四大模式:soft、mixed、hard、keep 的区别
    Gitreset中四大模式:soft、mixed、hard、keep的区别目录Gitreset中四大模式:soft、mixed、hard、keep的区别gitreset--soft(常用)gitreset--mixed(默认)gitreset--hard(慎用)gitreset--keep(吃灰)参考工作区暂存区本地版本库soft保持所有保持回退mixed保......
  • git pull如果提示merge冲突,先进行git reset --hard origin/master 后再git pull
    前言全局说明gitpull如果提示merge冲突,先进行gitreset--hardorigin/master后再gitpull一、说明gitreset--hardorigin/mastergitreset--hardorigin/master是一个Git命令,它的作用是将本地的当前分支重置到远程分支origin/master的状态。这个命令会丢失......
  • D2. Set To Max (Hard Version)
    原题链接题解具体想\(a\)是如何一步一步变成\(b\)是很复杂的,所以我们换个角度思考(比如贡献)遍历每一个\(a[i]\)看看他们能帮助哪些\(a[j]\)变成\(b[j]\)而且不妨碍\((i,j)\)中\(a\)的元素,用数学语言表达就是\(use[j]=1;a[i]=b[j]>a[j];a[l]<a[i],l\in(i,j)or(j,i......
  • 小红不想做完全背包 (hard)(DP)--牛客周赛 Round 39-D
    #include<bits/stdc++.h>usingnamespacestd;#defineintlonglong#defineendl'\n'#defineinf1e18constintmod=1e9+7;constintN=2005;//typedef__int128lll;//typedefunsignedlonglongull;intn,p;inta[N],dp[N];voidsolve(){......
  • 通过滤镜filter属性hue-rotate变换主题的方案
    主题切换方案一般都是依赖Css变量去做,但是可以通过滤镜属性可以实现主题色的变换;1,hue-rotate属性,用于调整元素的色相,色相的概念可以在HSL中看到H:色相S:饱和度L:亮度body{filter:hue-rotate(45deg);}成本几乎为0,实现简单。缺点是对于某些图片或者不想改的颜色需......