scau实验题 9491 最大子矩阵和

裸题,最大子矩阵和,将二维压缩为一维,以行为准,每次枚举一行的和(从i列到j列的和),再对行进行最大子序列和DP求解,时间复杂度为O(N^3)

 

#include <stdio.h>

#include <string.h>

#define INF -1000000000

#define N 110

int a[N][N];

int sum[N];

int n;



void input()

{

    int i,j;

    scanf("%d",&n);

    for(i=1; i<=n; i++)

        for(j=1; j<=n; j++)

            scanf("%d",&a[i][j]);

    return ;

}

void get_sum(int i , int j)

{

    int t,c;  //代表行

    memset(sum,0,sizeof(sum));

    for(c=1 ; c<=n ;c++)

    {

        for(t=i; t<=j; t++)

            sum[c]+=a[c][t];

    }

    

    return ;

}



int DP()

{

    int i,TMPSUM,SUM;

    TMPSUM=SUM=0;

    for(i=1; i<=n; i++)  //代表行

    {

        TMPSUM+=sum[i];

        if(TMPSUM>SUM) SUM=TMPSUM;

        else if(TMPSUM<0) TMPSUM=0;

    }



    return SUM;

}

int main()

{

    int i,j,ans,max;

    input();

    max=INF;

    for(i=1; i<=n; i++)

        for(j=i; j<=n; j++)

        {

            get_sum(i,j);  //压缩二维空间为一维,求出每一行的i列到j列的连续和,再按行来进行DP求解

            ans=DP();

            max=ans>max ? ans : max;

        }

    printf("%d\n",max);

    return 0;

}

你可能感兴趣的:(ca)