输入n*n的矩阵,求它的子矩阵,使和最大。
最大子串和的加强版。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n, a[105][105], b[105];
int max_sub(){ //求b数组的最大子串和
int i, res, sum[105];
for(i=1; i<=n; i++)sum[i]=b[i];
res=b[1];
for(i=2; i<=n; i++){
if(sum[i-1]>0)sum[i]+=sum[i-1];
if(sum[i]>res)res=sum[i];
}
return res;
}
int main(){
//freopen("1.txt", "r", stdin);
int i, j, k, ans;
while(scanf("%d", &n)!=EOF){
ans=-0x7fffffff;
for(i=1; i<=n; i++)
for(j=1; j<=n; j++)
scanf("%d", &a[i][j]);
for(i=1; i<=n; i++){ //枚举从i行开始的矩阵
memset(b, 0, sizeof(b));
for(j=i; j<=n; j++){ //枚举以j行结束的矩阵
for(k=1; k<=n; k++)
b[k]+=a[j][k]; //b数组中存子矩阵每一列的和
if(ans<max_sub())
ans=max_sub(); //用最大子串和求最大子矩阵和
}
}
printf("%d\n", ans);
}
return 0;
}