最大子矩阵问题
i,j 控制纵向扩展,sum记录最大连续数组的和控制横向扩展
具体如下表示
a b c
矩阵 = d e f
g h i
i=0
j=0
k=0 1 2 矩阵为 [a,b,c],用sum记录最大连续数组并更新
j=1
k= 0 1 2 矩阵为 [a+d,b+e,c+f],用sum记录最大连续数组并更新
j=2
k=0 1 2 矩阵为[a+d+g,b+e+h,c+f+i],用sum记录最大连续数组并更新
i=1
j=1
k=0 1 2矩阵为[d,e,f],用sum记录最大连续数组并更新
j=2
k=0 1 2矩阵为[d+g,e+h,f+i],用sum记录最大连续数组并更新
i=2
j=3
k=0 1 2矩阵为[d,h,i],用sum记录最大连续数组并更新
代码如下
#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int a[130][130];
int b[130];
int main()
{
int n,maxa = -0xfffffff;
cin>>n;
for(int i = 0; i < n; i++)
for(int j = 0; j < n; j++)
cin>>a[i][j];
for(int i = 0; i < n; i++)
{
memset(b, 0, sizeof(b));
for(int j = i; j < n; j++)
{
int sum = 0;
for(int k = 0; k < n; k++)
{
b[k] = b[k] + a[j][k];
sum = sum + b[k];
if(sum<0) sum = 0;
maxa = max(maxa,sum);
}
}
}
cout<<maxa<<endl;
return 0;
}