poj1050 To the Max

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<math.h>
#include<algorithm>
using namespace std;
int n;
int a[110][110];
int h[110][110];
int f[110];
int mmax;
int d[110];//d[i]为以i结尾的f段的最大值
void dp()
{
    int i;
    d[0]=f[0];
    if(mmax<d[0])
    {
        mmax=d[0];
    }
    for(i=1;i<n;i++)
    {
        if(d[i-1]>=0)
        {
            d[i]=d[i-1]+f[i];
        }
        else
        {
            d[i]=f[i];
        }
        if(mmax<d[i])
        {
            mmax=d[i];
        }
    }
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        int i,j;
        for(i=0;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        for(i=0;i<n;i++)
        {
            h[0][i]=a[0][i];
        }
        for(i=1;i<n;i++)
        {
            for(j=0;j<n;j++)
            {
                h[i][j]=h[i-1][j]+a[i][j];
            }
        }
        int k;
        mmax=-65530;
        for(i=0;i<n;i++)
        {
            for(j=0;j<=i;j++)//j行到i行的压缩
            {
                for(k=0;k<n;k++)//k列
                {
                    f[k]=h[i][k]-h[j][k]+a[j][k];
                }
                dp();
            }
        }
        printf("%d\n",mmax);
    }
    return 0;
}
posted @ 2012-08-08 11:22  willzhang  阅读(253)  评论(0)    收藏  举报