코드와이
[BAEKJOON] 1915. 가장 큰 정사각형 본문
DP
문제링크
https://www.acmicpc.net/problem/1915
1915번: 가장 큰 정사각형
첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다.
www.acmicpc.net
주어진 r, c 값보다 1씩 더 큰 map을 만든다. 이중 for문으로 (r-1, c-1) 점부터 시작해서 '오른쪽', '아래', '오른쪽 아래' 의 값을 비교해서 최솟값을 구한다. 각 값은 정사각형의 크기를 나타내는 값이다.
package acmicpc.Gold5;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class 가장_큰_정사각형 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int r = Integer.parseInt(st.nextToken());
int c = Integer.parseInt(st.nextToken());
int[][] map = new int[r+1][c+1];
int[][] dp = new int[r+1][c+1];
for(int i = 0 ; i < r ; i++) {
String s = br.readLine();
for(int j = 0 ; j < c ; j++) {
map[i][j] = s.charAt(j) - '0';
dp[i][j] = map[i][j];
}
}
int Down = 0;
int Right = 0;
int DownRight = 0;
int min = 987654321;
int ans = 0;
for(int i = r - 1 ; i >= 0 ; i--) {
for(int j = c - 1 ; j >= 0 ; j--) {
if(map[i][j] == 0) continue;
Down = dp[i + 1][j];
Right = dp[i][j + 1];
DownRight = dp[i + 1][j + 1];
min = Math.min(Down, Math.min(Right, DownRight));
dp[i][j] = min + 1;
ans = Math.max(ans, dp[i][j]);
}
}
System.out.println(ans * ans);
}
}
'acmicpc' 카테고리의 다른 글
[BAEKJOON] 9019. DSLR (0) | 2021.06.28 |
---|---|
[BAEKJOON] 2493. 탑 (0) | 2021.06.25 |
[BAKEJOON] 2589. 보물섬 (0) | 2021.06.24 |
[BAEKJOON] 17144. 미세먼지 안녕! (0) | 2021.06.22 |
[BAEKJOON] 5014. 스타트링크 (0) | 2021.06.20 |