hdu1081-最大子矩阵和(zoj-1074)

杭电链接:http://acm.hdu.edu.cn/showproblem.php?pid=1081

浙大链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1074

题意就是给你一个矩阵,找出一个子矩阵,这个子矩阵中所有的数的和是所有可能得到的子矩阵中的最大值,输出这个值。

思路就是和最大连续子序列一样,只不过用行压缩,把几行加和看成一行,变成最大子序列。具体方法是用一个二维数组a[i][j],表示这是第j列前i行的和得到所有数据和,然后开始遍历,用3个for循环,一行一行的找(这里的一行表示的是前几行的和),然后一列一列的加,最终就能得到最大和。结合代码看。

AC代码:

#include<stdio.h>
#include<string.h>
#define maxn 105
int main()
{
    int a[maxn][maxn];
    int n,t;
    while(scanf("%d",&n)!=EOF)
    {
        memset(a,0,sizeof(a));
        for(int i=1; i<=n; i++)
        {
            for(int j=1; j<=n; j++)
            {
                scanf("%d",&t);
                a[i][j]=a[i-1][j]+t;
            }
        }
        int sum;
        int m=0;
        for(int i=1; i<=n; i++)
        {
            for(int j=i; j<=n; j++)
            {
                sum=0;
                for(int k=1; k<=n; k++)
                {
                    t=a[j][k]-a[i-1][k];
                    sum+=t;
                    if(sum<0)sum=0;
                    if(sum>m)m=sum;
                }
            }
        }
        printf("%d\n",m);
    }
    return 0;
}

 

 

posted @ 2013-07-28 16:37  拼搏今朝 努力奋进  阅读(170)  评论(0)    收藏  举报