题目

题目见 01间隔矩阵

大概意思就是 给一个只含有01的矩阵,找出最大的01间隔矩阵。
码不是自己的,来自luoshaochuan

输入:
5 7
0101010
1000101
0101010
1010101
0101010

输出:
21

思路

解法是DP,按行扫,对于每个元素找出左边界右边界和高度。
找边界的时候向左向右两个loop来propagete, propagete的时候要注意高度的条件,即延伸方向元素的高度不能低于当前元素。

DP表格

假设矩阵存在A[N] [N]里,左边界L[N],右边界R[N], 高度H[N].
DP的题真是,不画表格真的不能理解,智商压制。
图片描述

代码

#include <iostream>
#include <string>
using namespace std;

#define maxn 2006

int R[maxn], L[maxn], H[maxn];
char A[maxn][maxn];

int main() {
    int n,m;
    cin >> n >> m;

    for(int i = 0; i < n; ++i){
        cin >> A[i];
    }

    int ans = 0;

    for(int i = 0; i < n; ++i){
        for(int j = 0; j < m; ++j){
            if(i > 0 && A[i][j] != A[i-1][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] && A[i][L[j]] != A[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] && A[i][R[j]] != A[i][R[j]+1])
                R[j] = R[R[j]+1];
        }

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

    cout << ans << endl;

    return 0;
}

最后吐槽SF的编辑器真是烂啊 。。。


KirkBai
27 声望6 粉丝