#include <iostream>
#include <vector>
#include <tuple>
#include <algorithm>
int main()
{
int N = 0;
std::cin >> N;
std::vector<std::tuple<int, int, int>> vec(N);
std::vector<std::tuple<int, int, int>> DP(N, { 100000000,100000000, 100000000 });
for (int i = 0; i < N; ++i)
{
std::cin >> std::get<0>(vec[i]) >> std::get<1>(vec[i]) >> std::get<2>(vec[i]);
}
DP[0] = { std::get<0>(vec[0]),std::get<1>(vec[0]),std::get<2>(vec[0]) };
for (int i = 1; i < N; ++i)
{
std::get<0>(DP[i]) = std::min(std::get<1>(DP[i - 1]), std::get<2>(DP[i - 1])) + std::get<0>(vec[i]);
std::get<1>(DP[i]) = std::min(std::get<0>(DP[i - 1]), std::get<2>(DP[i - 1])) + std::get<1>(vec[i]);
std::get<2>(DP[i]) = std::min(std::get<0>(DP[i - 1]), std::get<1>(DP[i - 1])) + std::get<2>(vec[i]);
}
std::cout << std::min(std::min(std::get<0>(DP[N - 1]), std::get<1>(DP[N - 1])), std::get<2>(DP[N - 1]));
return 0;
}
DP문제입니다.
tuple을 쓴 이유는 2가지를 넘어갔기 때문에 pair를 이용하기 보다는 tuple로 하는 것이 좋을 것이라 생각했습니다.
시작을 3가지 위치로 결정해서 끝까지 계산을 한 뒤 어느 부분이 가장 작은가 확인하면 됩니다.
'오늘의 알고리즘' 카테고리의 다른 글
| [C++] 백준 1504 특정한 최단 경로 (0) | 2022.10.02 |
|---|---|
| [C++] 백준 1167 트리의 지름 (1) | 2022.10.01 |
| [C++] 백준 1043 거짓말 (0) | 2022.09.28 |
| [C++] 백준 17626 Four Squares (0) | 2022.09.27 |
| [C++] 백준 17219 비밀번호 찾기 (0) | 2022.09.27 |