※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 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

+ Recent posts