Luogu P1736_ The same routine as p1387

maintain maximum left, up and diagonal expansion

Then go to the minimum of the three directions and add 1

************************************************************************************************

#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

const int maxn = 2510;

int a[maxn][maxn];
int dp[maxn][maxn];//Maximum 1 extended in the diagonal direction
int verti[maxn][maxn], level[maxn][maxn];//extended at most 0 in vertical/horizontal direction

int m, n;

intmain()
{
    int i, j;
    scanf("%d %d", &m, &n);
    memset(dp, 0, sizeof(dp));
    memset(verti, 0, sizeof(verti));
    memset(level, 0, sizeof(level));
    int years = 0;
    // top left to bottom right
    for(i = 1; i <= m; ++i)
        for(j = 1; j <= n; ++j)
    {
        scanf("%d", &a[i][j]);
        if(!a[i][j])
        {
            verti [i] [j] = verti [i-1] [j] +1;
            level[i][j] = level[i][j-1]+1;
        }
        else
        {
            dp[i][j] = min(dp[i-1][j-1], min(verti[i-1][j], level[i][j-1]))+1;
            yrs = max(yrs, dp[i][j]);
        }
    }
    // top right to bottom left
    memset(dp, 0, sizeof(dp));
    memset(verti, 0, sizeof(verti));
    memset(level, 0, sizeof(level));
    for(i = 1; i <= m; ++i)
        for(j = n; j >= 1; --j)
    {
        if(!a[i][j])
        {
            verti [i] [j] = verti [i-1] [j] +1;
            level[i][j] = level[i][j+1]+1;
        }
        else
        {
            dp[i][j] = min(dp[i-1][j+1], min(verti[i-1][j], level[i][j+1]))+1;
            yrs = max(yrs, dp[i][j]);
        }
    }
    printf("%d\n", ans);
    return 0;
}


Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325726305&siteId=291194637