最大子矩阵和

问题:就是输入一个N*M的矩阵,找出在矩阵中,所有元素加起来之和最大的子矩阵。

 

 思路:将输入的矩阵每一列求前几项和,此时矩阵的每一行都相当于一个二维矩阵,此后用求最大子序列求最大值即可。

#include <stdio.h>
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
const double PI=acos(-1.0);
const int inf=0x7fffffff;
int a[105][105];
int dp[105][105];
int n,m,mx,sum; 

int main(){
	mx=-inf;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			mx=max(mx,a[i][j]);
		}
	}
	if(mx<0) cout<<mx;//若矩阵最大元素都小于0,直接输出最大值即可 
	else{
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				a[i][j]=a[i-1][j]+a[i][j];//将每一列求前几项和,此后的每一行都可以理解成一个二维矩阵。 
			}
		}
	    for(int i=1;i<=n;i++){           //i:减去矩阵的行数 
			for(int j=i;j<=n;j++){       //j:处理的矩阵开始的行数 
				sum=0;                   //每次处理一个矩阵开始,sum归0 
				for(int k=1;k<=m;k++){   //每次处理矩阵要遍历每一列,相当于用求最大子序列算法 
					if(sum+a[j][k]-a[i-1][k]<0){
						sum=0;
					}
					else{
						sum+=a[j][k]-a[i-1][k];
					}
					mx=max(mx,sum);      //每处理完一个矩阵要更新最大值 
				}
			}
		}
	}
	cout<<mx;
	return 0; 
}

  

posted @ 2020-02-24 13:02  Maxwell·  阅读(898)  评论(1编辑  收藏  举报