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; }