zoukankan      html  css  js  c++  java
  • 最大矩阵的边界和和总和

    膜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
    ",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
    ",maxx);
    	}
    	return 0;
     } 



  • 相关阅读:
    转:imageNamed和dataWithContentsOfFile的区别
    [内存管理实践 之 1]在返回按钮中,释放内存
    转:当程序崩溃的时候怎么办 Part2
    iOS 内存管理,我们需要一套切实可行的实践指导书,而不是理论指导书
    转 iOS程序中调用系统自带应用(短信,邮件,浏览器,地图,appstore,拨打电话)
    iOS笔记:内存管理
    转:【图文教程】创建Xcode自定义模板
    判断两个数的大小,返回其中的大者/小者
    iOS全局变量与属性的内存管理
    UIImage 详解
  • 原文地址:https://www.cnblogs.com/Nlifea/p/11745996.html
Copyright © 2011-2022 走看看