题意:给出N*N的矩阵,求它子矩阵的最大和。
分析:
这题是最大子序列和的一个扩充。
关键是怎样用单一的子序列来求矩阵。目前没想到什么高深的算法。只有枚举了,只是小小的dp。
先求出矩阵一行,相当于求最大子序列和,再次求两个合并的,三个合并的,一直到n个。时间复杂度为(n^3)不过这题数据不大。完全可以A了。
代码:
#include<stdio.h>
#include<string.h>
int a[105][105];
int max_sum(int n,int *a)
{
int i,max=0,b=0;
for(i=0;i<n;i++)
{
if(b>0) b+=a[i];
else b=a[i];
if(b>max) max=b;
}
return max;
}
int max_martix(int m,int n)
{
int i,j,k,sum,max=0;
int b[105];
for(i=0;i<m;i++)
{
for(j=0;j<n;j++)
b[j]=0;
for(j=i;j<m;j++)
{
for(k=0;k<n;k++)
b[k]+=a[j][k]; //起到合并的作用。
sum=max_sum(k,b);
if(sum>max)
max=sum;
}
}
return max;
}
int main()
{
int n,i,j;
while(scanf("%d",&n)!=EOF)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
scanf("%d",&a[i][j]);
printf("%d\n",max_martix(n,n));
}
}