LETTers第五场-最大子矩阵-解题报告

题目描述: 

   本题题意就是给出一个n*m矩阵,然后求一个x*y的子矩阵,并且此子矩阵元素和最大。

题面建模:

    简单模拟。

    思路还是很简单的,我们设计一个sum[n][m],其中sum[i][j]表示以(1,1)为左上顶点,以(i,j)为右下顶点的矩阵的所有元素和。这样我们要求以(i,j)为右下顶点大小为x*y的子矩阵所有元素和就有以下公式:

ans=sum[i][j]-sum[i-x][j]-sum[i][j-y]+sum[i-x][j-y]

遍历所有这样的子矩阵就可以求出答案。

解题要点:

    注意边界的处理。

时空开销分析:

    空间复杂度:O(n^2)。

    时间复杂度:O(n^2)。

特别说明:

    无。

程序:

 

#include <stdio.h>
#include <string.h>
int sum[1010][1010];
int main()
{
    int t,n,m,x,y,max,i,j;
    scanf("%d",&t);
    while(t--)
    {
        max=0;
        memset(sum,0,sizeof(sum));
        scanf("%d %d %d %d",&m,&n,&x,&y);
        for(i=1;i<=m;i++)
            for(j=1;j<=n;j++)
            {
                scanf("%d",sum[i]+j);
                sum[i][j]+=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1];
            }
        for(i=x;i<=m;i++)
            for(j=y;j<=n;j++)
                max=max>sum[i][j]-sum[i-x][j]-sum[i][j-y]+sum[i-x][j-y]?max:sum[i][j]-sum[i-x][j]-sum[i][j-y]+sum[i-x][j-y];
        printf("%d\n",max);
    }
    return 1;
}

 

 

posted @ 2012-04-21 09:33  LETTers  阅读(220)  评论(0编辑  收藏  举报