最大矩阵的边界和和总和


膜sen爷爷:

题意:给你一个n*m的矩阵(1<=n,m<=1000)但是其中的正数最多100个其余的全是0,
让你求子矩阵最大的边界和 


由于没有oj判题,自己写了一个代码就放在这里了,望大家检查
代码:
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1005;
const int maxv = 105;
const int inf = 0x3f3f3f3f;

int Map[maxn][maxn],Map1[maxv][maxv];
int h[maxv][maxv],l[maxv][maxv];
int n,m;
int pos1,pos2;
int vh[maxn],vl[maxn];

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		memset(vh,0,sizeof(vh));
		memset(vl,0,sizeof(vl));
		scanf("%d %d",&n,&m);
		for(int i = 1;i<=n;i++){
			for(int j = 1;j<=m;j++){
				scanf("%d",&Map[i][j]);
				if(Map[i][j]){
					vh[i] = 1;
					vl[j] = 1;
				}
			}
		}
		pos1 = 0;
		for(int i = 1;i<=n;i++){
			if(vh[i]){
				pos1 ++;
				pos2 = 0;
				for(int j = 1;j<=m;j++){
					if(vl[j]){
						pos2++;
						Map1[pos1][pos2] = Map[i][j];
					}
				}
			}
		}
		for(int i = 1;i<=pos1;i++){
			for(int j = 1;j<=pos2;j++){
				h[i][j] = h[i][j-1] + Map1[i][j];
				l[i][j] = l[i-1][j] + Map1[i][j];
			}
		}
		int maxx = -inf;
		for (int i = 1;i<=pos1;i++){
			for (int j = i;j<=pos1;j++){
				int maxl = 0;
				for (int k = 1;k<=pos2;k++){
					int sum = maxl + l[j][k] - l[i-1][k];
					if(sum > maxx){
						maxx = sum;
					}
					if(k == 1){
						maxl = l[j][k] - l[i-1][k];
					} else if(i == j)
					{
						maxl = max(maxl + Map1[i][k],maxl);
					} else {
						maxl = max(maxl + Map1[i][k] + Map1[j][k], l[j][k] - l[i-1][k]);
					}
				}
			}
		}printf("%d\n",maxx);
	}
	return 0;
}
最大子矩阵的总和:
代码:
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1005;
const int maxv = 105;
const int inf = 0x3f3f3f3f;

int Map[maxn][maxn],Map1[maxv][maxv];
int h[maxv],l[maxv];
int per[maxv][maxv];
int pos1,pos2;
int n,m;

int main()
{
	int t;
	scanf("%d",&t);
	while(t--)
	{
		memset(h,0,sizeof(h));
		memset(l,0,sizeof(l));
		scanf("%d%d",&n,&m);
		for(int i = 1;i<=n;i++){
			for(int j = 1;j<=m;j++){
				scanf("%d",&Map[i][j]);
				if(Map[i][j]){
					h[i] = 1;
					l[j] = 1;
				}
			}
		}
		pos1 = 0;
		for(int i = 1;i<=n;i++){
			if(h[i]){
				pos1 ++;
				pos2 = 0;
				for(int j = 1;j<=m;j++){
					if(l[j]){
						pos2 ++;
						Map1[pos1][pos2] = Map[i][j];
					}
				}
			}
		}
		for(int i = 1;i<=pos1;i++){
			for(int j = 1;j<=pos2;j++){
				per[i][j] = per[i-1][j] + per[i][j-1] - per[i-1][j-1] + Map1[i][j];
			}
		}
		int maxx = -inf;
		for(int i = 1;i<=pos1;i++){
			for(int j = i;j<=pos2;j++){
				int sum = 0;
				for(int k = 1;k<=pos2;k++){
					int temp = per[j][k] - per[j][k-1] - per[i-1][k] + per[i-1][k-1];
					if(sum > 0){
						sum += temp;
					} else {
						sum = temp;
					}
					if(sum > maxx){
						maxx = sum;
					}
				}
			}
		}printf("%d\n",maxx);
	}
	return 0;
 } 



猜你喜欢

转载自blog.csdn.net/acer12138/article/details/80628170