给定一个 n×m的矩阵 A,求 A 中的一个非空子矩阵,使这个子矩阵中的元素和最大。其中,A的子矩阵指在 A 中行和列均连续的一部分。
输入格式
输入的第一行包含两个整数 n,m(1≤n,m≤50),分别表示矩阵 A 的行数和列数。
接下来 n 行,每行 m 个整数,表示矩阵 Ai,j(−1000≤Ai,j≤1000)。
输出格式
输出一行,包含一个整数,表示 A 中最大子矩阵的元素和。
样例输入
3 3
2 -4 1
-1 2 1
4 -2 2
样例输出
6
#include<iostream>
#include<string.h>
#include<cmath>
#include<algorithm>
using namespace std;
int a[52][52],b[52][52];
int main(){
int n,m;
int max=-2000;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
b[i][j]=b[i-1][j]+a[i][j];/*b[i][j]表示第j列的第一行到第i行之和*/
}
}
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j++){
int sum=0;
for(int k=1;k<=m;k++){
sum+=b[j][k]-b[i-1][k];/*b[j][k]-b[i-1][k]表示第k行的第i行到第j行之和*/
if(sum>max) max=sum;
if(sum<0) sum=0;/*要是第k列前面的k-1列之和为负数,与后面的数相加会变小,所以把它初始化重新加*/
}
}
}
cout<<max<<endl;
return 0;
}