pku1050: To the Max

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*/

posted on 2012-07-25 14:15  acmer-jun  阅读(209)  评论(0编辑  收藏  举报

导航