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;

}

 

你可能感兴趣的:(max)