Algorithm

[BOJ] 4883번 : 삼각 그래프

rudgh99_algo 2024. 10. 2. 07:11

1. problem : 

https://www.acmicpc.net/problem/4883

 

2. solution 1 :

#include <bits/stdc++.h>
using namespace std;
const int val = 100005;
int d[val][4]; 
int a[val][4];
int main(void) {
	ios::sync_with_stdio(0);
	cin.tie(0);
	int t = 0;
	while (true) {
		t++;
		int n; 
		cin >> n; 
		if (n == 0) return 0; 
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= 3; j++) cin >> a[i][j];
		}

		d[1][1] = INT_MAX; 
		d[1][2] = a[1][2]; 
		d[1][3] = a[1][2] + a[1][3];
		for (int i = 2; i <= n; i++) {
			d[i][1] = min(d[i - 1][1], d[i - 1][2]) + a[i][1]; 
			d[i][2] = min({ d[i - 1][1],d[i - 1][2],d[i - 1][3],d[i][1] }) + a[i][2]; 
			d[i][3] = min({ d[i - 1][2],d[i - 1][3],d[i][2] }) + a[i][3]; 
		}
		cout << t << ". " << d[n][2] << '\n';
	}
}

dp를 이용해 풀었다. 따라서 세 가지 스텝을 따른다. 

1. 테이블을 정의한다. d [i][j] = i번째 행, j번째 열에서의 최솟값 

2. 점화식을 작성한다. 위 코드 참고 

3. 초기값을 설정한다. d [1][1] = INT_MAX, d [1][2] = a [1][2] , d [1][3] = a [1][2] + a [1][3]

 

상수로 표기할 수 있는 곳은 상수로 표기하자.