335 words
2 minutes
[BOJ] 가장 큰 정사각형
TimeLimit | MemoryLimit | Condition | TAG |
---|---|---|---|
1s | 128MB | (1 ≤ n, m ≤ 1,000) | Dynamic Programming |
이것도 전형적인 dp 문제로 점화식이 굉장히 직관적이라 풀기 좋았습니다.. 요즘 어려운 문제 보다가 이런 문제 보니까 그나마 숨이 트이네요.. ㅠㅜ
현재 위치에서 정사각형이려면 위에서 정사각형이였던 애들을 전부다 검사해서 왼쪽, 위, 좌 대각선에 있는 값이 전부다 정사각형이었다면 그 중에서 작은 친구의 정사각형 값을 1 확장해주면 된다.
이런 아이디어로 AC를 맞았습니다. 근데 y <= && x <= 0
조건을 이따구로 써서 2번 틀렸는데 조심하셔요.. 무의식적으로 작성된 코드는 사람을 고뇌에 빠트립니다.
정답 코드
#include <iostream>
#include <string>
#include <vector>
#include <set>
using namespace std;
using ll = long long;
int n, m;
int dp[1001][1001];
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
int current;
char tmp;
int result = 0;
cin >> n >> m;
for(int y = 0; y < n; y++){
for(int x = 0; x < m; x++){
cin >> tmp;
current = tmp - '0';
dp[y][x] = current;
if(current){
if(x <= 0 || y <= 0) continue;
dp[y][x] = min({dp[y][x-1], dp[y-1][x], dp[y-1][x-1]}) + 1;
}
}
}
for(int i = 0; i < n; i++){
for(int j = 0; j < m; j++){
result = max(result, dp[i][j]);
}
}
cout << result * result;
return 0;
}
[BOJ] 가장 큰 정사각형
https://compy07.github.io/Blog/posts/boj/1915/