IT民工
加油!

  这是一道求最大子矩阵和的题,之前做过求最大一维数列连续和,所以可以将每列

压缩到一列,将二维变成一维,这样枚举所有的情况,找到一个一维最大连续和即可。

 

/* Accepted 216K 32MS C++ 775B 2012-04-11 09:05:12 */

#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXN 105
#define max(a, b) ( a > b ? a : b)
const int inf = 0x3f3f3f3f;
int t[MAXN][MAXN], a[MAXN];
int ans, n;

void dp( int *a) //这个函数和求最大连续和没区别
{
    int sum = 0;
    for( int i = 1; i <= n; i ++)
    {
        sum = max( sum + a[i], 0);
        ans = max( sum, ans);
    }
}

int main()
{
    while( scanf( "%d", &n) == 1)
    {
        ans = -inf;
        for( int i = 1; i <= n; i ++)
            for( int j = 1; j <= n; j ++)
                scanf( "%d", &t[i][j]);
        for( int i = 1; i <= n; i ++) //i是子矩阵的起始行
            for( int j = i; j <= n; j ++) //j是子矩阵的结束行
            {
                memset( a, 0, sizeof a);
                for( int k = 1; k <= n; k ++) //k代表每列
                    for( int tt = i; tt <= j; tt ++) //由i到j压缩到一列
                    {
                        a[k] += t[tt][k];
                    }
                dp( a);
            }
        printf( "%d\n", ans);
    }
    return 0;
}

 

 

 

posted on 2012-04-11 09:13  找回失去的  阅读(165)  评论(0)    收藏  举报