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;
}
posted @ 2012-10-26 10:44  Titanium  阅读(165)  评论(0编辑  收藏  举报