※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 4883번 문제인 삼각 그래프이다.
문제는 아래 링크를 확인하자.
https://www.acmicpc.net/problem/4883
4883번: 삼각 그래프
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 그래프의 행의 개수 N이 주어진다. (2 ≤ N ≤ 100,000) 다음 N개 줄에는 그래프의 i번째 행에 있는 정점의 비용이
www.acmicpc.net
문제에서 주어진 양식의 그래프를 보고 점화식을 세워 푸는 dp 문제이다.
주어진 그래프는 DAG임을, 즉 사이클이 존재하지 않는 그래프임을 확인하자. 또한, 노드들을 행 순서대로, 같은 행 안에서는 왼쪽 노드부터 순서대로 접근하는 것으로 이 그래프를 위상정렬순으로 순회할 수 있다는 점을 확인하자.
위의 관찰을 이용해 각 열의 노드별로 점화식을 세워 문제를 해결하자.
아래는 제출한 소스코드이다.
#include <iostream>
using namespace std;
typedef long long ll;
int T;
int L;
ll A, B, C, a, b, c;
void solve() {
cin >> A >> B >> C; A = 1000000007, C += B; L--;
while (L--) {
ll x, y, z; cin >> x >> y >> z;
a = min(A, B) + x;
b = min(min(A, B), min(C, a)) + y;
c = min(min(B, C), b) + z;
A = a, B = b, C = c;
}
cout << T << ". " << B << '\n';
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> L;
while (L) {
T++;
solve();
cin >> L;
}
}
728x90
'BOJ' 카테고리의 다른 글
[BOJ 1358 // C++] 하키 (0) | 2023.03.11 |
---|---|
[BOJ 27660 // C++] Queue skipping (Hard) (0) | 2023.03.11 |
[BOJ 2618 // C++] 경찰차 (0) | 2023.03.10 |
[BOJ 2116 // C++] 주사위 쌓기 (0) | 2023.03.10 |
[BOJ 25378 // C++] 조약돌 (0) | 2023.03.09 |