求最大子矩阵和的时候,思路是取出两行i,j,,把这两行之间同一列的都加起来形成另外一个数组,求这个数组的最大子段和,求出来的这个和,就是这两行之间高度为i-j的子矩阵中最大的和.
#include<iostream>
#include<string.h>
using namespace std;
int n,a[100][100],c[100];
//求解最大字段和
int maxsegment()
{
int i;
int sum=0,b=0;
for(i=0;i<n;i++)
{
if(b>0)
b+=c[i];
else
b=c[i];
if(b>sum)
sum=b;
}
return sum;
}
//求解最大子矩阵和
int maxmatrix()
{
int i,j,k;
int maxs=0;
int total;
for(i=0;i<n;i++)
{
memset(c,0,sizeof(c));//注意!!! 不能忽略
for(j=i;j<n;j++)
{
for(k=0;k<n;k++)
{
c[k]+=a[j][k];//依次各层求和比较,即扩大子矩阵的大小,1-1,2-2,3-3......
}
total=maxsegment();
if(total>maxs)
maxs=total;
}
}
return maxs;
}
int main()
{
cin>>n;
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
cin>>a[i][j];
cout<<maxmatrix()<<endl;
return 0;
}