02 最大子矩阵
求一个n*n方阵中最大的子矩阵。
这是一个二位最大子矩阵问题,做法是将二位压缩至一维,再进行求解。
压缩过程中,从第一行往下,先依次压缩入b【】,并比较求出最大子串,直至到最后一行结束。要注意的是b【k】每次 i变化时要赋值为0.
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,i,j,k,max,sum;
cin>>n;
int a[101][101],b[101];
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
cin>>a[i][j];
max=0;
for(i=1;i<=n;i++) // i行开始
{
for(k=1;k<=n;k++)
{
b[k]=0;
}
for(j=i;j<=n;j++) // j行结束
{
for(k=1;k<=n;k++) //压入到 b【】
{
b[k]+=a[j][k];
}
int l,maxx=0,c=0; //求 b【】最长子序列
for(l=1;l<=n;l++)
{
if(c>0)
c+=b[l];
else
c=b[l];
if(maxx<c)
maxx=c;
}
if(max<maxx)
max=maxx;
}
}
cout<<max<<endl;
return 0;
}