题目:
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:
9 2
-4 1
-1 8
其元素总和为15。
输入描述:
第一行输入一个整数n(0<n<=100),表示有n组测试数据; 每组测试数据: 第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列; 随后有r行,每行有c个整数;
输出描述:
输出矩阵的最大子矩阵的元素之和。
样例输入:
复制
1 4 4 0 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
样例输出:
15
提示:
没有提示哦
来源:
上传者:苗栋栋
思路:
暴力枚举:用前缀和的思路做,两个相减就能解出其中的之和暴力枚举一下求出横行的哪个大和竖行的枚举全部就ok
代码
#include<iostream>
#include<cstring>
using namespace std;
int a[1009][1009];
int main()
{
int n,m;
scanf("%d",&n);
while(n--)
{
memset(a,0,sizeof(a));
scanf("%d%d",&n,&m);
for(int i = 1;i <= n;++i)
{
for(int j = 0;j < m;++j)
{
scanf("%d",&a[i][j]);
a[i][j] += a[i-1][j];//用前缀和的思路存起来
}
}
int max1 = a[1][0];//弄个最大值以便之后找
for(int i=0;i<n;++i)//枚举上区间
{
for(int j=i+1;j<=n;++j)枚举下区间
{
int step = 0 ;
for(int k =0 ;k<m;++k)枚举右区间
{
step = step>=0?step:0;//左区间和为负数就不取
step+=a[j][k]-a[i][k];//求区间和
max1 = max(max1,step);//找到区间最大值
}
}
}
printf("%d\n",max1);输出
}
return 0;
}