https://www.acmicpc.net/problem/1915
이번 문제는 다이나믹 프로그래밍 알고리즘(DP)을 이용하는 문제로 DP 문제 중에서는 쉬운 난이도에 속하는 것 같습니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
n, m = map(int, input().split())
data = []
for i in range(n):
s = input()
data.append(list(map(int, list(s))))
dp = [[0 for _ in range(m + 1)] for _ in range(n + 1)]
side = 0
for i in range(1, n + 1):
for j in range(1, m + 1):
if data[i - 1][j - 1] == 1:
dp[i][j] = min(dp[i][j - 1], dp[i - 1][j], dp[i - 1][j - 1]) + 1
if dp[i][j] > side:
side = dp[i][j]
print(side**2)
|
cs |
data : input으로 들어오는 숫자 배열을 받은 2차원 리스트
dp : data 리스트를 탐색하면서 채울 DP 테이블
side : 최대 변의 길이
data[i - 1][j - 1]가 0일 경우 정사각형을 만들 수 없으므로 1일 경우에만 체크합니다.
dp[i][j]에는 data[i - 1][j - 1]를 정사각형의 우측하단 꼭짓점으로하여 만들수 있는 정사각형의 변의 길이를 저장합니다.
side에 새로 만들어진 변의 길이가 최대 길이인지 확인하고 수정합니다.
728x90
'난 이 분야 전문가야! > Algorithm' 카테고리의 다른 글
[백준][C] 17070 파이프 옮기기 1 - 풀이 공유 (0) | 2020.05.04 |
---|---|
[백준][Python] 2294 동전2 - 풀이 공유 (0) | 2020.04.30 |
[백준][C] 2994 내한 공연 - 풀이 공유 (1) | 2020.04.28 |
[백준][Python] 2960 에라토스테네스의 체 - 풀이 공유 (0) | 2020.04.19 |
[백준][Python] 11502 세 개의 소수 문제 - 풀이 공유 (0) | 2020.04.19 |