https://www.acmicpc.net/problem/12026
전형적인 DP문제네요.
1차원 DP이구요
정의는 n까지가는데 최소 비용이라고 정의하면 되겠습니다.
메모이제이션을 하면서 재귀를 돌렸습니다.
문제 풀 떄 꿀팁은 인풋을 받을 때가 중요합니다.
B = 0
O = 1
J = 2
로 배열에 저장했습니다.
그래서 B다음에 O로 갈 땐 (arr[현재 위치] + 1) % 3 == arr[다음 위치] 이 조건이 성립하는 곳으로 이동하시면 됩니다.
코드입니다.
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 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include <iostream> #include <vector> #include <string.h> using namespace std; #define ll long long #define MOD (ll)1e15 #define MAX_SIZE (int)1e5 #define mp make_pair #define INF 987654321 #define pii pair<int, int> //ios::sync_with_stdio(false); cin.tie(0); int street[1000]; int dp[1000]; int n; int min(int a, int b) { return a < b ? a : b; } int dfs(int pos) { if (pos == n - 1) return 0; int &ret = dp[pos]; if (ret != -1) return ret; ret = INF; for (int i = pos + 1; i < n; i++) if(street[i] == (street[pos] + 1) % 3) ret = min(ret, dfs(i) + (i - pos) * (i - pos)); return ret; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 0; i < n; i++) { char c; cin >> c; if (c == 'B') street[i] = 0; else if (c == 'O') street[i] = 1; else street[i] = 2; } memset(dp, -1, sizeof(dp)); int ret = dfs(0); cout << (ret == INF ? -1 : ret); return 0; } | cs |
'알고리즘 > 다이나믹 프로그래밍(DP)' 카테고리의 다른 글
[2565] 전깃줄 (0) | 2017.09.07 |
---|---|
[2688] 줄어들지 않아 (0) | 2017.07.27 |
[1563] 개근상 (0) | 2017.07.24 |
[2225] 합 분해 (0) | 2017.07.24 |
[2158] 동전 교환 (0) | 2017.07.09 |