题目:
给定一个n*m的矩阵A,求A中的一个非空子矩阵,使得这个子矩阵中的元素和最大。其中,A的子矩阵指在A中行和列均连续的一部分。
输入格式
输入的第一行包含两个整数,n,m(1<=n,m<=50),分别表示矩阵A的行数和列数
接下来n行,每行m个整数,表示矩阵Ai,j(-1000<=Ai,j<=1000)
输出格式
输出一行,包含一个整数,表示A中最大的子矩阵的元素和。
样例输入
3 3
2 -4 1
4 -2 2
样例输出
6
- 分析思路:
选几行和几列,使得元素和最大
暴力枚举上下左右四个边界,求和
要求非空,最小选比-1000还小(矩阵元素为负数的时候)之后更新元素和(和大于-1000的时候)
- 代码:
#include <iostream>
#include <algorithm>
using namespace std;
int A[60][60];
int main(){
int n,m,ans;
cin>>n>>m;
ans=-1010; //元素和最小可能比-1000还小
//读入矩阵
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>A[i][j];
}
}
//枚举上下左右四个边界
for(int i=0;i<n;i++){ //枚举上边界
for(int j=i;j<n;j++){ //下边界,j=i(下边界最少要等于上边界)
for(int k=0;k<m;k++){ //左边界
for(int g=k;g<m;g++){ //右边界,至少要大于左边界 g=k
int temp=0; //记录元素和 (i大于j,temp等于0,空矩阵不合法)
for(int p=i;p<=j;p++){ //从上边界开始
for(int q=k;q<=g;q++){ //左边界开始
temp+=A[p][q]; //当前子矩阵
}
}
if(temp>ans){
ans=temp; //更新
}
}
}
}
}
cout<<ans<<endl;
return 0;
}