比如,如下4 * 4的矩阵
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
的最大子矩阵是
9 2
-4 1
-1 8
这个子矩阵的大小是15。
4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
15
#include<iostream>
using namespace std;
int a[101][101],b[101];
int js(int b[200],int n)
{
int i,max,c;
c=0;max=0;
for(i=1;i<n;i++)
{
if(c>0)
c+=b[i];
else c=b[i];
if(max<c)
max=c;
}
return max;
}
int main()
{
int i,j,n,max,sum,k;
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cin>>a[i][j];
}
max=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
b[j]=0;
for(j=i;j<=n;j++)
{ for(k=1;k<=n;k++) b[k]+=a[j][k];
sum=js(b,n);
if(max<sum)
max=sum;
}
}
cout<<max<<endl;
}
滚动数组,先让行相加再选列,问题变成了最大字段和,用一维数组代表列,赋初值为零。
using namespace std;
int a[101][101],b[101];
int js(int b[200],int n)
{
int i,max,c;
c=0;max=0;
for(i=1;i<n;i++)
{
if(c>0)
c+=b[i];
else c=b[i];
if(max<c)
max=c;
}
return max;
}
int main()
{
int i,j,n,max,sum,k;
cin>>n;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
cin>>a[i][j];
}
max=0;
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
b[j]=0;
for(j=i;j<=n;j++)
{ for(k=1;k<=n;k++) b[k]+=a[j][k];
sum=js(b,n);
if(max<sum)
max=sum;
}
}
cout<<max<<endl;
}
滚动数组,先让行相加再选列,问题变成了最大字段和,用一维数组代表列,赋初值为零。