Ural(Timus) 1146. Maximum Sum

DP,最大子矩阵和:先按列压缩为一维i,在用最大连续子序列和来求。在枚举列压缩求和的时候,为了提高速度,可以在输入的时候先保存下来,就不用每次都去计算,不过再代码中没有写

另外这题不允许空矩阵,即至少要有一个元素,所以代码要做稍微的修改,就这样WA了几次

/*最大子矩阵和,先压缩为一维再求最大子序列和,时间复杂度O(n^3)*/

#include <cstdio>
#include <cstring>
#define N 1100
#define INF 0x3f3f3f3f
int a[N][N],s[N],n;

void get_sum(int x ,int y)
{
    for(int i=0; i<n; i++)
    {
        s[i]=0;
        for(int k=x; k<=y; k++)
            s[i]+=a[i][k];
    }
    return ;
}

int DP()
{
    int sum=0,max=-INF;
    for(int i=0; i<n; i++)
    {
        sum+=s[i];
        max=sum>max?sum:max;
        if(sum<0) sum=0;
    }
    return max;
}
int main()
{
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=0; i<n; i++)
            for(int j=0; j<n; j++)
                scanf("%d",&a[i][j]);

        int max=-INF,ans;
        for(int i=0; i<n; i++)
            for(int j=i; j<n; j++)
            {
                get_sum(i,j);
                ans=DP();
                max=ans>max?ans:max;
            }
        printf("%d\n",max);
    }
    return 0;
}

 

posted @ 2013-01-21 12:02  Titanium  阅读(335)  评论(0编辑  收藏  举报