太久没做题了 , 没什么思路的说 。。
看了别人的解体报告后,感觉好神奇啊。只要把后面的各个行依次加到前一行,再求一维数组的最长子序列和。。有点像每次假设一个小矩阵,在这矩阵中寻找最大矩阵和 而这些小矩阵就是 人为通过扩大矩阵宽度以及起始行来实现的
学习了~~~~~
#include<iostream>
#include<stdio.h>
using namespace std;
#define N 105
int a[N][N];
int maxSub(int a[],int n)
{
int msum=-128,sum=0,l,r;
l=r=0;
while(r<n)
{
if(sum+a[r]<a[r])sum=a[r];
else
sum+=a[r];
r++;
if(msum<sum)msum=sum;
}
return msum;
}
int main()
{
int i,n,j,k,max=-128,s;
scanf("%d",&n);
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
for(i=0;i<n;i++)
{
s=maxSub(a[i],n);
if(s>max)max=s;
for(j=i+1;j<n;j++)
{
for(k=0;k<n;k++)
a[i][k]+=a[j][k];
s=maxSub(a[i],n);
if(s>max)max=s;
}
}
printf("%d\n",max);
return 0;
}