最大子矩阵和
问题:就是输入一个N*M的矩阵,找出在矩阵中,所有元素加起来之和最大的子矩阵。

思路:将输入的矩阵每一列求前几项和,此时矩阵的每一行都相当于一个二维矩阵,此后用求最大子序列求最大值即可。
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <string.h>
using namespace std;
const double PI=acos(-1.0);
const int inf=0x7fffffff;
int a[105][105];
int dp[105][105];
int n,m,mx,sum;
int main(){
mx=-inf;
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j];
mx=max(mx,a[i][j]);
}
}
if(mx<0) cout<<mx;//若矩阵最大元素都小于0,直接输出最大值即可
else{
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
a[i][j]=a[i-1][j]+a[i][j];//将每一列求前几项和,此后的每一行都可以理解成一个二维矩阵。
}
}
for(int i=1;i<=n;i++){ //i:减去矩阵的行数
for(int j=i;j<=n;j++){ //j:处理的矩阵开始的行数
sum=0; //每次处理一个矩阵开始,sum归0
for(int k=1;k<=m;k++){ //每次处理矩阵要遍历每一列,相当于用求最大子序列算法
if(sum+a[j][k]-a[i-1][k]<0){
sum=0;
}
else{
sum+=a[j][k]-a[i-1][k];
}
mx=max(mx,sum); //每处理完一个矩阵要更新最大值
}
}
}
}
cout<<mx;
return 0;
}

浙公网安备 33010602011771号