题目

题目见 01间隔方阵
之前发的一篇是01间隔矩阵,这篇是间隔方阵。
码也是根据之前的改的。
找出01矩阵中边长最长的01间隔正方形

思路

最大面积都找出来了,最大正方形还找不出么。。
还是DP找出左右边界和高,然后最后条件改成max(ans,min(H[j],R[j]-L[j]+1))就行了

代码

#include <iostream>

using namespace std;
#define maxn 1010
char c[maxn][maxn];
int L[maxn], H[maxn], R[maxn];

int main() {
    int n,m;
    cin >> n >> m;
    for(int i = 0; i < n; i++){
        cin >> c[i];
    }

    int ans = 0;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            if(i>0 && c[i-1][j]!=c[i][j]) ++H[j];
            else H[j] = 1;
        }

        for(int j = 0; j<m; j++){
            L[j] = j;
            while(L[j] && H[j] <= H[L[j]-1] && c[i][L[j]] != c[i][L[j]-1])
                L[j] =L[L[j]-1];
        }

        for(int j = m-1; j >=0; j--){
            R[j] = j;
            while(R[j]<m-1 && H[j]<=H[R[j]+1] && c[i][R[j]] != c[i][R[j]+1])
                R[j] = R[R[j]+1];
        }

        for(int j = 0; j < m; j++){
            int temp = min(H[j],R[j]-L[j]+1);
            ans=max(ans,temp);
        }
    }

    cout << ans << endl;
    return 0;
}

KirkBai
27 声望6 粉丝