동적 계획법 예제 - 8
Last updated
Last updated
dp[i][j] # (i, j) 위치에서 왼쪽 위로 만들 수 있는 최대 정사각형 길이 저장)
n(세로)
m(가로)
max(한 변의 최대 길이 저장)
for i n:
dp 테이블 데이터 저장
for i n번:
for j m번:
if dp[i][j]의 값이 1이면:
현재 위치에서 왼쪽, 위쪽 대각선 왼쪽 중 가장 작은 값에 1을 더한 값을 현재 위치에 저장
max 값 갱신
max 제곱 출력import sys
input = sys.stdin.readline
n, m = map(int, input().split())
dp = [[0 for _ in range(1001)] for _ in range(1001)]
for i in range(n):
data = list(input().strip()) # strip() : 공백 제거
dp[i] = [int(x) for x in data]
Max = -sys.maxsize
for i in range(n):
for j in range(m):
if int(dp[i][j]) == 1 and i > 0 and j > 0:
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1], dp[i - 1][j - 1]) + 1
Max = max(Max, dp[i][j])
print(Max * Max)import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Stack;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
long[][] dp = new long[1001][1001];
for (int i = 0; i < n; i++) {
String[] data = br.readLine().split("");
for (int j = 0; j < m; j++) {
dp[i][j] = Integer.parseInt(data[j]);
}
}
long max = Integer.MIN_VALUE;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
if (dp[i][j] == 1 && i > 0 && j > 0) {
dp[i][j] = Math.min(Math.min(dp[i][j - 1], dp[i - 1][j]), dp[i - 1][j - 1]) + 1;
}
max = Math.max(max, dp[i][j]);
}
}
System.out.println(max * max);
}
}