본문 바로가기
-----ETC-----/C++ 심화 알고리즘과 자료구조 시리즈

[C++로 배우는 알고리즘과 자료구조 심화] Day 15: 다차원 동적 계획법 (Multidimensional DP)

by cogito21_cpp 2024. 8. 1.
반응형

다차원 동적 계획법 (Multidimensional DP)

다차원 동적 계획법은 상태를 여러 차원으로 정의하여 문제를 해결하는 기법입니다. 이 방법은 주로 상태를 더 구체적으로 나누어 관리할 때 사용됩니다. 예를 들어, 3차원 DP는 dp[i][j][k]와 같이 상태를 표현할 수 있습니다.

문제 예시: 3차원 DP를 이용한 여행 계획

주어진 도시들을 방문하면서 최소 비용으로 여행 계획을 세우는 문제를 해결하기 위해 3차원 DP를 사용할 수 있습니다. 여기서 dp[i][j][k]는 i번째 도시를 j번째 날에 k번 방문했을 때의 최소 비용을 의미합니다.

 

다차원 DP 구현

다음은 C++로 3차원 DP를 사용하여 문제를 해결하는 예제입니다.

 

문제 정의

주어진 도시들의 방문 비용이 포함된 cost 행렬이 있습니다. 여행자는 특정 순서로 도시들을 방문하며, 동일한 도시는 최대 max_visits 번까지 방문할 수 있습니다. 목표는 여행자의 전체 여행 비용을 최소화하는 것입니다.

 

다차원 DP 예제

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>

// 최대 방문 가능한 도시 수
const int MAX_CITIES = 100;

// 최대 방문 가능한 날 수
const int MAX_DAYS = 100;

// 최대 방문 가능한 횟수
const int MAX_VISITS = 10;

int main() {
    int numCities, numDays, maxVisits;
    std::cin >> numCities >> numDays >> maxVisits;

    // 도시 방문 비용 행렬
    std::vector<std::vector<int>> cost(numCities, std::vector<int>(numCities));
    for (int i = 0; i < numCities; ++i) {
        for (int j = 0; j < numCities; ++j) {
            std::cin >> cost[i][j];
        }
    }

    // 3차원 DP 테이블 초기화
    std::vector<std::vector<std::vector<int>>> dp(MAX_CITIES, std::vector<std::vector<int>>(MAX_DAYS, std::vector<int>(MAX_VISITS, INT_MAX)));

    // 시작점 설정
    dp[0][0][1] = 0;

    for (int day = 1; day <= numDays; ++day) {
        for (int city = 0; city < numCities; ++city) {
            for (int visit = 1; visit <= maxVisits; ++visit) {
                if (dp[city][day - 1][visit - 1] != INT_MAX) {
                    for (int nextCity = 0; nextCity < numCities; ++nextCity) {
                        dp[nextCity][day][visit] = std::min(dp[nextCity][day][visit], dp[city][day - 1][visit - 1] + cost[city][nextCity]);
                    }
                }
            }
        }
    }

    // 최소 비용 계산
    int minCost = INT_MAX;
    for (int city = 0; city < numCities; ++city) {
        for (int visit = 1; visit <= maxVisits; ++visit) {
            minCost = std::min(minCost, dp[city][numDays][visit]);
        }
    }

    std::cout << "최소 여행 비용: " << minCost << std::endl;

    return 0;
}

 

설명

  1. 입력:
    • numCities: 도시의 수
    • numDays: 여행 일수
    • maxVisits: 각 도시의 최대 방문 횟수
    • cost: 도시 간 이동 비용 행렬
  2. 3차원 DP 테이블:
    • dp[i][j][k]는 i번째 도시를 j번째 날에 k번 방문했을 때의 최소 비용을 의미합니다.
    • 초기값으로 INT_MAX를 설정하여 불가능한 상태를 표시합니다.
  3. 동적 계획법 점화식:
    • dp[nextCity][day][visit] = std::min(dp[nextCity][day][visit], dp[city][day - 1][visit - 1] + cost[city][nextCity])
    • 이전 날 방문한 도시에서 다음 도시로 이동하는 비용을 계산합니다.
  4. 결과 출력:
    • 모든 도시에서 가능한 최소 비용을 계산하여 출력합니다.

다차원 동적 계획법의 기본 개념과 구현 방법을 이해했습니다. 질문이나 피드백이 있으면 언제든지 댓글로 남겨 주세요. 내일은 "Day 16: DP 최적화 기법(Convex Hull Trick, Divide and Conquer Optimization)"에 대해 학습하겠습니다.

반응형