개발일지

Algorithm in A..Z - 백준 2449 전구 본문

Problem Solving

Algorithm in A..Z - 백준 2449 전구

강태종 2021. 5. 9. 19:57

www.acmicpc.net/problem/2449

 

2449번: 전구

입력의 첫 번째 줄에는 전구의 수를 나타내는 양의 정수 N과 전구가 표현할 수 있는 색의 수 K가 주어진다. 단, N은 1이상 200이하의 정수이며, K는 1이상 20이하의 정수이다. 두 번째 줄에는 N개 전

www.acmicpc.net


접근

 

1) dp[left][right][color]

재귀함수로 구간에 특정 color로 색칠하는 방법을 고민했다.

=> 실패 이유는 모르겠다.

 

2) dp[left][right]

하지만 구간을 나누고 특정 color로 색칠할 필요가 없었다. => left의 색이나 right의 색으로 칠하는 것이 자명하기 때문이다.

dp[left][right] = min(dp[left][i] + dp[i + 1][right] + (color[left] != color[i + 1]))의 점화식으로 n^3으로 해결할 수 있다.


코드

#include <bits/stdc++.h>
using namespace std;

int n, k;
vector<int> ve;

vector<vector<int>> dp;
int solve(int l, int r) {
    if (l >= r) {
        return 0;
    }

    if (dp[l][r] != INT32_MAX) {
        return dp[l][r];
    }

    for (int i = l; i < r; ++i) {
        int ll = solve(l, i);
        int rr = solve(i + 1, r);

        dp[l][r] = min(dp[l][r], ll + rr + (ve[l] != ve[i + 1]));
    }

    return dp[l][r];
}

int main() {
    ios::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr);

    cin >> n >> k;
    ve.resize(n);
    for (auto &i : ve) {
        cin >> i;
    }

    dp.assign(n, vector<int>(n, INT32_MAX));
    cout << solve(0, n - 1) << "\n";
}
Comments