悬线法

01矩阵求最大全1的矩形和正方形

#include<bits/stdc++.h>
using namespace std;
const int N = 2020;
int l[N][N],r[N][N],u[N][N];
bool a[N][N];
int main(){
    int n,m;    cin >> n >> m;
    for(int i = 1; i <= n; ++i)
    for(int j = 1; j <= m; ++j){
        cin >> a[i][j];
        
        l[i][j] = r[i][j] = j;
        u[i][j] = 1;
    }
    
    for(int i = 1; i <= n; ++i)
        for(int j = 2; j <= m; ++j)
            if(a[i][j] != a[i][j-1])
                l[i][j] = l[i][j-1];
    for(int i = 1; i <= n; ++i)
        for(int j = m - 1; j ; --j)
            if(a[i][j] != a[i][j + 1])
                r[i][j] =r[i][j + 1];
    int ans1 = 1,ans2 = 1;
    for(int i = 1; i <= n; ++i)
    for(int j = 1; j <= m; ++j){
        if(i != 1 && a[i][j] != a[i-1][j]){
            u[i][j] = u[i-1][j] + 1;
            l[i][j] = max(l[i][j],l[i-1][j]);
            r[i][j] = min(r[i][j],r[i-1][j]);
        }
       
        ans1 = max(ans1,min(u[i][j],r[i][j] - l[i][j] + 1));
        ans2 = max(ans2,(r[i][j] - l[i][j] + 1) * u[i][j]);
    }
    cout << ans1 * ans1 << '\n' << ans2 << '\n';
    
    return 0;
}
rush!
原文地址:https://www.cnblogs.com/LH2000/p/15597603.html