전공/알고리즘
백준 1915(가장 큰 정사각형)
xkdlaldfjtnl
2020. 12. 15. 17:28
1915번: 가장 큰 정사각형
첫째 줄에 n, m(1 ≤ n, m ≤ 1,000)이 주어진다. 다음 n개의 줄에는 m개의 숫자로 배열이 주어진다.
www.acmicpc.net
이 문제도 Rebro님이 추천해주신 문제
10109 Troyangles랑 비슷한 유형의 2차원 dp문제이다.
dp가 된다는 것을 알면 이제 남은건 간단하다 dp가 되는 규칙찾기
이 문제는 i,j가 정사각형의 맨왼쪽위로 설정한뒤에 앞선 문제와 동일한 방식으로 dp 테이블을 채워 나가면 된다.
dp[i][j] = min(dp[i+1][j+1], dp[i+1][j], dp[i][j+1]) +1
#include<iostream>
#include<algorithm>
using namespace std;
#define MAX 1005
int mat[MAX][MAX];
int dp[MAX][MAX];
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++) {
for (int j = 0; j < m; j++) {
char a;
cin >> a;
mat[i][j] = a - '0';
}
}
int ans = 0;
for (int i = n - 1; i >= 0; i--) {
for (int j = m - 1; j >= 0; j--) {
if (mat[i][j] == 0)continue;
dp[i][j] = min({ dp[i + 1][j + 1], dp[i + 1][j], dp[i][j + 1] })+1;
ans = max(ans, dp[i][j]);
}
}
cout << ans*ans;
}