[BOJ]最大の正方形


使用するデータ構造/アルゴリズム


与えられた配列の中で最大の正方形を探す問題.
(0,0)点から(n−1,m−1)点まで巡回し,dpを用いて答えを探す.
各セル(r,c)では、2 x 2の正方形を左+の周囲に上向きに形成するかどうかを決定することができる.
:(r,c),(r-1,c),(r,c-1),(r-1,c-1)
dp[r][c]は左上隅の正方形を格納する.
この時点でmin(dp[r-1][c], dp[r][c-1], dp[r-1][c-1])を得ると、
2 x 2内の左上隅セルの最小正方形の大きさを求めることができます.
dp[r][c] = min(dp[r-1][c], dp[r][c-1], dp[r-1][c-1]) + 1
したがって、上記のコードを各セルに適用すると、
正方形の大きさを蓄積することで、最大の正方形の大きさを求めることができます.

コード#コード#

from sys import stdin
input = stdin.readline

n, m = map(int, input().split())
board = []
for _ in range(n):
    board.append([int(x) for x in list(input().strip())])
dp = [[0]*(m+1) for _ in range(n+1)]

for r in range(1, n+1):
    for c in range(1, m+1):
        if board[r-1][c-1] == 1:
            dp[r][c] = min(dp[r-1][c], dp[r][c-1], dp[r-1][c-1]) + 1

max_width = max([max(row) for row in dp])
print(max_width**2)