题目描述
给定一个n*m的矩阵A,求A中的一个非空子矩阵,使这个子矩阵中的元素和最大。
其中,A的子矩阵指在A中行和列均连续的一块。
样例说明
取最后一列,和为10。 数据规模和约定 对于100%的数据,1< =n, m< =500,A中每个元素的绝对值不超过5000。
输入
输入的第一行包含两个整数n, m,分别表示矩阵A的行数和列数。 接下来n行,每行m个整数,表示矩阵A。
输出
输出一行,包含一个整数,表示A中最大的子矩阵中的元素和。
样例输入
代码语言:javascript复制3 3
-1 -4 3
3 4 -1
-5 -2 8
样例输出
代码语言:javascript复制10
思路:
用up,down,left,right框定出子阵,用 sum 表示子阵的值,然后与Max进行比较,如果sum值>Max,赋值给Max,直到Max为最大值。
代码
代码语言:javascript复制#include <iostream>
using namespace std;
const int inf = 0x3f3f3f3f;
int a[60][60];
int main()
{
int n,m;
cin>>n>>m;
for(int i = 0;i<n;i ){
for(int j = 0;j<m;j ){
cin>>a[i][j];
}
}
int Max = -inf;
for(int up = 0; up < n;up ){
for(int down = up;down < n; down ){
for(int left = 0;left <m;left ){
for(int right = left; right < m;right ){
int sum = 0;
for(int k = up;k<=down;k ){
for(int l = left;l<=right;l ){
sum =a[k][l];
}
}
if(sum>Max){
Max = sum;
}
}
}
}
}
cout << Max<< endl;
return 0;
}