luoguP1719 最大加权矩形
思路
求最大子矩阵可以转换为求最大子段和的问题。可以先看看这个最大子段和
主要思路就是将二维数组压缩成一维,再分别求最大子段和
代码
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
int w[105][105];
long int b[105];
long int _max(long int a[]) //求一维数组的最大子段和
{
long int x=-1;
long int s=-1e8;
for(int i=1;i<=n;i++)
{
x=x>0?x+a[i]:a[i];
s=max(s,x);
}
return s;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
scanf("%d",&w[i][j]);
long int ans=-1e8,s=0; //将ans初始为一个特别小的数
for(int i=1;i<=n;i++) //起始行从1到n
{
memset(b,0,sizeof(b)); //注意每次要重置b数组
for(int j=i;j<=n;j++)
{
for(int k=1;k<=n;k++)
{
b[k]+=w[j][k]; //将二维压缩至一维
}
s=_max(b); //求最大子段和
ans=max(ans,s);
}
}
printf("%ld\n",ans);
return 0;
}