PS
BOJ 14925 : 목장 건설하기
lickelon
2024. 8. 3. 22:16
- 문제 링크 : boj.kr/14925
- 난이도 : G4
- 태그 : DP
코드
#include <bits/stdc++.h>
#define all(x) (x).begin(), (x).end()
#define INF 0x7FFFFFFF
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int,int>;
using pll = pair<ll, ll>;
int main()
{
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int m, n;
cin >> m >> n;
vector<vector<int>> arr(m, vector<int>(n));
vector<vector<int>> dp(m, vector<int>(n));
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
cin >> arr[i][j];
if(arr[i][j]) dp[i][j] = 0;
else dp[i][j] = 1;
}
}
for(int i = 1; i < m; i++) {
for(int j = 1; j < n; j++) {
if(arr[i][j] > 0) continue;
dp[i][j] = min({dp[i-1][j-1], dp[i-1][j], dp[i][j-1]}) + 1;
}
}
int ans = 0;
for(int i = 0; i < m; i++) {
for(int j = 0; j < n; j++) {
ans = max(ans, dp[i][j]);
}
}
cout << ans;
return 0;
}
풀이
2차원 DP문제이다.
(i-1, j), (i-1, j-1), (i, j-1) 세 곳이 모두 길이가 K인 정사각형이 가능하고, (i, j)가 비었다면 (i, j)에선 길이가 K+1인 정사각형이 가능하다.
728x90