Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- AppBarLayout
- 코틀린
- lifecycle
- Algorithm
- kotlin
- Android
- CollapsingToolbarLayout
- onLayout
- recyclerview
- sqlite
- 안드로이드
- CoordinatorLayout
- CustomView
- 백준
- onMeasure
- ViewModel
- BOJ
- 알림
- hilt
- Navigation
- Behavior
- 알고리즘
- View
- activity
- DataBinding
- HTTP
- Coroutine
- notification
- LiveData
- room
Archives
- Today
- Total
개발일지
Algorithm in A..Z - 백준 2449 전구 본문
접근
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";
}
'Problem Solving' 카테고리의 다른 글
Algorithm in A..Z - Programmers 트리 트리오 중간값 (0) | 2021.09.08 |
---|---|
Algorithm in A..Z - Programmers 몸짱 트레이너 라이언의 고민 (0) | 2021.09.06 |
Algorithm in A..Z - 백준 3648 아이돌 (0) | 2021.07.09 |
Algorithm in A..Z - 백준 4013 ATM (0) | 2021.07.09 |
Algorithm in A..Z - 백준 3830 교수님은 기다리지 않는다 (0) | 2021.04.20 |
Comments