这道题目想了好久没做出来,越想越复杂。后面百度了一下大牛的代码,才知道这个题目涉及到压缩问题。把二维的问题转化为一维的问题,然后就可以很快的解决问题。
(1)首先把题目中的矩阵转化为熟悉的数组。
for(j=i;j<n;j++)
{
for(k=0;k<n;k++)
{
b[k]+=a[j][k];
}
}
上述代码,将将矩阵的元素按列存到数组之中。
(2)对数组中的元素求最大子段和。
sum=0;
for(k=0;k<n;k++)
{
if(sum+b[k]>0)
{
sum+=b[k];
}
else
{
sum=0;
}
if(sum>max)
{
max=sum;
}
}
压缩是个好东西啊!学习了。
#include<iostream>
using namespace std;
int a[105][105];
int b[105];
int main()
{
int n;
int i,j,k,max,sum;
while(scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
scanf("%d",&a[i][j]);
}
}
max=-0xfffffff;
for(i=0;i<n;i++)
{
memset(b,0,sizeof(b));
for(j=i;j<n;j++)
{
for(k=0;k<n;k++)
{
b[k]+=a[j][k];
}
sum=0;
for(k=0;k<n;k++)
{
if(sum+b[k]>0)
{
sum+=b[k];
}
else
{
sum=0;
}
if(sum>max)
{
max=sum;
}
}
}
}
printf("%d\n",max);
}
return 0;
}