알고리즘/백준

[백준 1915] 가장 큰 정사각형 C++

겜도리도리 2021. 9. 13. 23:59
반응형

문제

백준 1915

 

1915번: 가장 큰 정사각형

첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다.

www.acmicpc.net

풀이

해당 영역에서 가장 큰 길이를 계산해 담고 있는 dp 배열을 이용합니다.

먼저 0열과 0행에는 입력값과 똑같은 값을 넣어줍니다.

0열과 0행을 제외하고, 해당 칸의 입력이 0이라면, 어짜피 사각형의 길이는 0이 되므로 dp에 0을 넣어줍니다.

1이라면 왼쪽, 위쪽, 왼쪽 위 3가지 값을 탐색하면서 dp 값을 구합니다.

dp값과 최대 길이 값을 비교하여 최댓값을 갱신합니다.

 

예제를 보겠습니다.

square

0 1 0 0
0 1 1 1
1 1 1 0
0 0 1 0

dp

0 1 0 0
0      
1     0
0 0   0

0행과 0열, 입력이 0인 부분은 square와 똑같이 초기화 합니다.

0 1 0 0
0 1 1 1
1 1 2 0
0 0 1 0

입력이 1인 부분은 (왼쪽, 위쪽, 왼쪽 위)의 최솟값에 1을 더한 값입니다. dp 배열을 채워줍니다.

가장 큰 사각형의 길이가 2입니다. 4를 출력합니다.

소스 코드

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
 
int square[1000][1000];
int dp[1000][1000];
int n, m;
int main()
{
    int maxlength = 0;
    cin >> n >> m;
    for (int i = 0; i < n; i++)
    {
        string s;
        cin >> s;
        for (int j = 0; j < s.size(); j++)
        {
            char temp = s[j];
            square[i][j] = temp - '0';
        }
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            dp[i][j] = square[i][j];
            int size = dp[i][j];
            if (square[i][j] == 1 && i != 0 && j != 0)
            {
                // 왼쪽과 위쪽 비교
                size = min(dp[i - 1][j], dp[i][j - 1]);
                // 대각선 왼쪽위 비교
                size = min(dp[i - 1][j - 1], size);
                size++;
                dp[i][j] = size;
            }
            // 최댓값 비교
            maxlength = max(size, maxlength);
        }
    }
    // 넓이
    cout << maxlength * maxlength;
    return 0;
}
cs
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[백준 5014] 스타트링크 C++  (0) 2021.09.16
[백준 11048] 이동하기 C++  (0) 2021.09.14
[백준 3190] 뱀 C++  (0) 2021.09.12
[백준 14502] 연구실 C++  (0) 2021.09.11
[백준 2583] 영역 구하기 C++  (0) 2021.09.10