위 그림과 같이 0 또는 1로 채워진 board가 주어질 때,
1로 이루어진 가장 큰 정사각형을 찾아야 한다.
단 board의 크기는 1000*1000 이하이다.
점화식
DP[i][j] = min(DP[i][[j-1], DP[i-1][j], DP[i-1][j-1]) + 1
식을 보면 알겠지만 DP[i][j]는 좌, 상, 좌상단 값 중 가장 작은 값 + 1 을 값으로 가진다.
그림으로 그려보았는데 그려놓고 보니 좀 난잡하다.
def solution(board):
answer = 0
board = [[0] * len(board[0])] + board
board = [[0]+b for b in board]
for i in range(len(board)):
for j in range(len(board[0])):
if board[i][j] != 0: # 당연히 현재 위치가 0이 아니어야 한다.
board[i][j] = min(board[i][j-1], board[i-1][j], board[i-1][j-1])+1
answer = max(board[i][j], answer)
return answer**2
어렴풋이 이해는 했지만 솔직히 아직 비슷한 문제를 풀 수 있을지 의문이 든다.
비슷한 문제들을 더 풀어봐야겠다.