萌新冒泡
上一道题的推广
子矩阵是由连续的几个不一定完整的列组成的 我们只需抓住是“连续”的这个特点即可 因此枚举起始行 结束行 对于这个区间 采用一维的方式来做
#include<bits/stdc++.h>
const int INF=0x3f3f3f3f;
const int N=505;
using namespace std;
int n,m,a[N][N],b[N],ans,sum;
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>a[i][j];
ans=-INF;
for(int i=1;i<=n;i++) //起始行
{
memset(b,0,sizeof(b));
for(int j=i;j<=n;j++) //结束行
{
//更新每一列的和
for(int k=1;k<=m;k++) b[k]+=a[j][k];
sum=0; int maxx=-INF;
for(int k=1;k<=m;k++)
{
sum+=b[k];
if(sum<0) sum=0;
maxx=max(maxx,sum);
}
ans=max(ans,maxx);
}
}
if(!ans) cout<<-10;
else cout<<ans<<endl;
return 0;
}