题意:给定一个n*m的矩阵,求出其中和最大的子矩阵
比如
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
他的最大子矩阵是
9 2
-4 1
-1 8和为15.
①首先最坏情况我们可以枚举行的上界和下界,列的上界和下界。
求和的话可以用前缀和解决。
②我们只枚举行的上界和下界。对于上界和下界中间的数累加成一个数,这样我们就压缩到了一维。
比如我们枚举到行的上界为2,下界为4.
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
压缩后变成了4 11 -10 1
那我们从中选择连续的几列求最大值,这就是一个一维的最大连续子段和问题了。
#include <bits/stdc++.h> using namespace std; int a[109][109]; int sumn[109][109],ans=-9999999; int main() { int n; cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>a[i][j]; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) sumn[i][j]=sumn[i][j-1]+a[j][i];//i列j行的前缀和 for(int i=1;i<=n-1;i++) { for(int j=i+1;j<=n;j++)//枚举矩形上界和下界 { int maxn=-9999999,last=0; for(int k=1;k<=n;k++)//最大连续子段和 { int shu=sumn[k][j]-sumn[k][i]; if(last<0) last=0; last+=shu; maxn=max(maxn,last); } ans=max(ans,maxn); } } cout<<ans; }