PS

BOJ 14925 : 목장 건설하기

lickelon 2024. 8. 3. 22:16

코드

#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