pku1050: http://poj.org/problem?id=1050
题意:求最大子矩阵
code:
#include<iostream>
#include<cstdio>
#include<cstdlib>
int v[200][200],b[200];
const int inf=1<<29;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
scanf("%d",&v[i][j]);
}
int sum=-inf;
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++) //用b[j]来存储i到j行的每一列之和,先初始化为0
b[j]=0;
for(int j=i;j<n;j++)
{
for(int k=0;k<n;k++) //依次求出第j行、第j~j+1行……第j~n行每一列之和
{
b[k]=b[k]+v[j][k];
}
int s=0,max=-inf;
for(int k=0;k<n;k++) //将b[0]、b[1]……、b[k](即各小竖列之和)看成一个数列,求出最大连续子序列
{
if(s>=0)
s=s+b[k];
else
s=b[k];
if(s>max)
max=s;
}
if(max>sum) //取最大值
sum=max;
}
}
printf("%d\n",sum);
}
}
/*input:
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
output:
15*/