【贪心枚举】 最大子矩阵和
传送门
题意
给定一个包含整数的二维矩阵,子矩形是位于整个阵列内的任何大小为1 * 1或更大的连续子阵列。
矩形的总和是该矩形中所有元素的总和。
在这个问题中,具有最大和的子矩形被称为最大子矩形,求出最大子矩形
数据范围
\(1 \leq N \leq 100\)
题解
预处理每一列的前缀和
暴力枚举起始行和终止行,用last记录未增加前的子矩阵,如果当前子矩阵的值<=0那么对于答案的贡献就是0可以舍弃
Code
#include<bits/stdc++.h>
using namespace std;
#define rep(i,a,n) for(int i=a;i<n;i++)
#define per(i,a,n) for(int i=n-1;i>=a;i--)
#define fi first
#define se second
#define ll long long
#define pb push_back
const int N=110;
int g[N][N];
int n;
int main(){
scanf("%d",&n);
rep(i,1,n+1)
rep(j,1,n+1) {
scanf("%d",&g[i][j]);
g[i][j] += g[i-1][j];
}
int ans=-1e12;
rep(i,1,n+1)
rep(j,i,n+1){
int last=0;
rep(k,1,n+1){
last=max(0,last)+g[j][k]-g[i-1][k];
ans=max(last,ans);
}
}
printf("%d\n",ans);
}

浙公网安备 33010602011771号