教程链接:https://www.51nod.com/tutorial/index.html#!tutorialId=2
分析:最大子矩阵其实就是二维的最大字段和,那么求解的时候就是爆搜选出所有连续的行,把选出的行压成一行,再用一维的最大字段和求解,最后统计最大值。
代码如下:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define LL long long
using namespace std;
int data[505][505];
int tem[505];
int m,n;
LL MaxSum;
LL MaxSquence()
{
LL ans,sum;
ans=sum=tem[0];
for(int i=1;i<n;i++)
{
if(sum>0)
sum+=tem[i];
else
sum=tem[i];
ans=max(ans,sum);
}
return ans;
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
MaxSum=-9999999999;
for(int i=0;i<m;i++)
for(int j=0;j<n;j++)
scanf("%d",&data[i][j]);
for(int i=0;i<m;i++)
{
for(int j=i;j<m;j++)
{
for(int k=0;k<n;k++)
tem[k]=(i==j)?data[j][k]:(tem[k]+data[j][k]);
MaxSum=max(MaxSum,MaxSquence());
}
}
printf("%lld\n",MaxSum);
}
return 0;
}