728x90
해결과정 - DP
처음에는 특정한 규칙이 있을거라 생각하여 사이클을 찾아보거나, 어떨때 최적이 될까를 찾아 보았다 하지만 딱히 규칙이 보이지 않아 고민하던중 한번씩 확인해 나가면 4 * 4 * 10만 번만 탐색하면 된다는 것을 알아차렸다.
일반적으로 탐색을 하게 되면 이미 확인했던 공간도 확인하게 되어 많은 시간이 소요되게 된다 따라서 바텀 업 방식이 아닌 탑 다운 방식을 도입하고 메모제이션을 사용하여 이미 방문한 곳은 방문하지 않도록 해주었다.
#include <bits/stdc++.h>
#define FAST ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
typedef long long ll;
using namespace std;
int calc_cost(int st, int to) {
if (st == 0) return 2;
if (st == to) return 1;
if (abs(st - to) == 2) return 4;
return 3;
}
vector<int> v;
int dp[5][5][100001];
int solve(int y, int x, int target) {
if (target == v.size()) return 0;
if (dp[y][x][target] != -1) return dp[y][x][target];
int left = solve(v[target], x, target + 1) + calc_cost(y, v[target]);
int right = solve(y, v[target], target + 1) + calc_cost(x, v[target]);
return dp[y][x][target] = min(left, right);
}
int main() {
FAST;
int n;
memset(dp, -1, sizeof(dp));
while (cin >> n) {
if (n == 0) break;
v.push_back(n);
}
cout << solve(0, 0, 0);
return 0;
}
후기
이젠 귀찮아서 하나의 헤더파일에 필요해 보이는 함수들을 때려넣어서 include를 하나만 선언해도 되게하였다 편하다 ㅎㅎ
아 넥슨 들어가고 싶다.
728x90
'알고리즘문제 풀어보기 > 백준' 카테고리의 다른 글
백준 - 11444 피보나치 수열 6 (0) | 2024.10.24 |
---|---|
백준 - 9252 LCS2 (0) | 2024.10.24 |
백준 20303 - 할로윈의 양아치 (1) | 2024.10.19 |
백준 - 27172 수 나누기 게임 (0) | 2024.10.19 |
백준 - 1644 소수의 연속합 (0) | 2024.10.18 |