문제 URL : https://www.acmicpc.net/problem/2666
2666번: 벽장문의 이동
첫 번째 줄에 벽장의 개수를 나타내는 3보다 크고 20보다 작거나 같은 하나의 정수, 두 번째 줄에 초기에 열려있는 두 개의 벽장을 나타내는 두 개의 정수, 그리고 세 번째 줄에는 사용할 벽장들
www.acmicpc.net
문제 접근법 : 전형적인 백트래킹 + 메모이제이션 활용문제입니다. 결국은 dp 문제라는 거겠죠
왼쪽으로 갔을때와 오른쪽으로 갔을때 최소로 이동했을때의 거리를 구하면 되는문제입니다.
소스코드 :
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
|
#include <bits/stdc++.h>
using namespace std;
#define ll long long
int n,m;
int u1, u2;
vector<int> v;
int dp[21][21][21];
int Min = 1e8;
void input() {
cin >> n;
cin >> u1 >> u2;
cin >> m;
v.resize(m+1);
for (int i = 1; i <= m; i++)
cin >> v[i];
}
int dfs(int idx,int use1,int use2) {
if (idx > m)return 0;
int& res = dp[idx][use1][use2];
if (res != -1)return res;
int left = dfs(idx + 1, v[idx], use2) + abs(v[idx] - use1);
int right = dfs(idx + 1, use1, v[idx]) + abs(v[idx] - use2);
return res = min(left, right);
}
void solve() {
memset(dp, -1, sizeof(dp));
cout << dfs(1,u1,u2)<< "\n";
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
//freopen("input.txt", "r", stdin);
input();
solve();
}
|
cs |
궁금한점 혹은 모르는점 어떤질문이든 댓글은 언제나 환영입니다.
'백준' 카테고리의 다른 글
백준 8972 미친 아두이노 (0) | 2021.10.24 |
---|---|
백준 1113 수영장 만들기 (0) | 2021.10.17 |
백준 10835 카드게임 (0) | 2021.10.05 |
백준 16401 과자 나눠주기 (0) | 2021.10.05 |
백준 11066 파일 합치기 (0) | 2021.09.29 |