문제 : https://www.acmicpc.net/problem/1915
[알고리즘풀이]
DP를 이용한 문제입니다.
다음과 같이 처음 dp[i][j] 에서 dp[i -1][j -1] / dp[i -1][j] / dp[i][j - 1] 이 0이 아니라 정사각형이 만들어지면 현재 만들어진 정사각형의 최대 길이를 dp[i][j]에 저장합니다.
3 x 3 크기의 정사각형은 다음과 같이 배열에 저장합니다.
물론, 한 곳이라도 0인 곳이 있으면 정사각형이 만들어지지 않으므로, 배열에 저장하지 않고 진행한다.
끝까지 진행해서 지금까지 만들어진 정사각형의 길이 중 가장 큰 값을 제곱해서 넓이를 출력한다.
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int map[1000][1000] = {};
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
string input;
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
cin >> input;
for (int j = 0; j < m; j++)
map[i][j] = int(input[j] - '0');
}
int ans = 0;
for (int j = 0; j < m; j++)
ans = max(ans, map[0][j]);
for (int i = 0; i < n; i++)
ans = max(ans, map[i][0]);
for (int i = 1; i < n; i++) {
for (int j = 1; j < m; j++) {
int t = min(map[i - 1][j - 1], min(map[i - 1][j], map[i][j - 1]));
if (t > 0 && map[i][j] > 0)
map[i][j] = t + 1;
ans = max(ans, map[i][j]);
}
}
cout << ans * ans;
}
'Problem Solving > BOJ' 카테고리의 다른 글
[BOJ] 18228 : 펭귄추락대책위원회 - travelbeeee (0) | 2019.12.24 |
---|---|
[BOJ] 1655 : 가운데를 말해요 - travelbeeee (0) | 2019.11.19 |
[BOJ] 4179 : Fire! - travelbeeee (0) | 2019.11.18 |
[BOJ] 1325 - 효율적인 해킹 : travelbeeee (0) | 2019.11.18 |
[BOJ] 5427 : fire - travelbeeee (0) | 2019.11.18 |