【贪心枚举】 最大子矩阵和

传送门

题意

给定一个包含整数的二维矩阵,子矩形是位于整个阵列内的任何大小为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);
}

posted @ 2020-06-30 01:21  Hyx'  阅读(241)  评论(0)    收藏  举报