Step-by-Step

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

언어/C++

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

희주(KHJ) 2022. 12. 15. 18:50

https://www.acmicpc.net/problem/1915

 

1915번: 가장 큰 정사각형

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

www.acmicpc.net

 

DP 없이 풀다가 시간 초과..ㅋㅋ ㅠㅠ 

 

일단 사각형이 되기 위해서는 사각형 내부(테두리 포함) 모두 1이어야 한다.

 

DP를 이용하면, 해당 좌표( i, j )의 ↑ ↖ ← 세 방향의 값의 최소값에 1을 더해주면 된다.

만약 세 방향 중 하나라도 0이 있으면 값이 1이 되고, 1은 칸 1개짜리 정사각형이다.

 

ex) 세 방향의 값이 각각 2, 4, 5 인 경우 dp값은 3이 된다.

초록색 부분은 신경 안 써도 된다. 4랑 5 앞칸이 0이었다면 4랑 5칸에 1이 있었을 것임 ( 최소값 0 + 1 = 1


 

점화식

dp[i][j] = min( min(dp[i-1][j-1] , dp[i-1][j]) , dp[i][j-1])

 

[코드]

#include <iostream>
#include <vector>

using namespace std;

int map[1001][1001];

int main(void) {
	ios::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);
	int n, m;
	cin >> n >> m;
	

	for (int i = 1; i <= n; i++) {
		string str;
		cin >> str;
		
		for (int j = 0; j < m; j++) {
			map[i][j+1] = str.at(j) - '0';
		}
	}

	int ans = 0;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= m; j++) {
			if (map[i][j] == 0)
				continue;

			map[i][j] = min(min( map[i - 1][j - 1], map[i - 1][j]), map[i][j - 1] ) + 1;

			ans = max(ans, map[i][j]);
		}
	}

	ans *= ans;
	cout << ans;
}

'언어 > C++' 카테고리의 다른 글

[C++] Struct와 Class  (0) 2022.11.29
[C++] Struct, priority_queue 간단한 사용  (0) 2022.11.15
[C++] Queue / Stack / Pair  (0) 2022.10.28
[C++] 백준2293 - 동전 1  (0) 2022.10.26
[C++] 기본 입출력  (0) 2022.10.26
Comments