본문 바로가기
백준

백준 2666 벽장문의 이동

by 콩순이냉장고 2021. 10. 5.

문제 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, -1sizeof(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