萌新冒泡
上一道题的推广
子矩阵是由连续的几个不一定完整的列组成的 我们只需抓住是“连续”的这个特点即可 因此枚举起始行 结束行 对于这个区间 采用一维的方式来做
#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;
}
本文深入探讨了一种求解二维数组中子矩阵最大和的高效算法。通过枚举子矩阵的起始行和结束行,利用一维数组动态更新列的累积和,实现了对连续列组成的子矩阵的最大和计算。代码示例清晰地展示了算法实现过程。
413

被折叠的 条评论
为什么被折叠?



