E1. Rotate Columns (easy version)(暴力)

题目链接

题意:给你一个n行,m列的矩阵。你可以对任意一列进行上下循环移位。定义 ri 为第i行的最大值,让你使得r1 + .. rn最大

题解:首先求出每一列的最大值,然后从大到小排序。可以肯定的是,对答案有贡献的一定是前n列(这里可以自己举几个例子,就不细说了)。n最大为4,暴力枚举每种情况有4^4种,这题就写完了。

#include
using namespace std;
struct node{
	int mx, id;
	bool friend operator < (node a, node b){
		return a.mx > b.mx;
	}
}e[110];
int a[11][110], id[5], ans;
int n, m, N;
void dfs(int pos){
	if(pos == N + 1){
		int t = 0;
		for(int i = 1; i <= n; ++i){
			int tmp = 0;
			for(int j = 1; j <= N; ++j)//求每一行最大值 
				tmp = max(tmp, a[i][id[j]]);
			t += tmp;
		}
		ans = max(ans, t);
		return;
	}
	for(int i = 1; i <= n; ++i){
		int tmp[5] = {0};
		for(int j = 1; j <= n; ++j)//进行循环移位 
			tmp[j] = a[j % n + 1][id[pos]];
		for(int j = 1; j <= n; ++j)
			a[j][id[pos]] = tmp[j];
		dfs(pos + 1);
	}
}
void init(){
	ans = 0;
	memset(a, 0, sizeof a);
	memset(id, 0, sizeof id);
	memset(e, 0, sizeof e);
}
int main()
{
	int T;
	scanf("%d", &T);
	while(T--){
		init();
		scanf("%d%d", &n, &m);
		for(int i = 1; i <= n; ++i)
		for(int j = 1; j <= m; ++j){
			scanf("%d", &a[i][j]);
			e[j].id = j;
			e[j].mx = max(e[j].mx, a[i][j]); 
		}
		sort(e + 1, e + 1 + m);
		N = min(n, m);
		for(int i = 1; i <= N; ++i)//保存前n列的下标 
			id[i] = e[i].id;
		dfs(1);
		printf("%d\n", ans);
	}
}

 

你可能感兴趣的:(CF)