문제링크 : https://www.acmicpc.net/problem/4883
4883번: 삼각 그래프
입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 그래프의 행의 개수 N이 주어진다. (2 ≤ N ≤ 100,000) 다음 N개 줄에는 그래프의 i번째 행에 있는 정점의 비용이
www.acmicpc.net
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define MAX 987654321
#define pii pair <int, int>
int N;
int graph[100000][3];
int dp[100000][3];
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(0);
int T = 1;
while(1)
{
int N;
cin >> N;
if(N==0) break;
for(int i=0; i<N; i++)
{
for(int j=0; j<3; j++)
{
cin >> graph[i][j];
}
}
dp[0][0] = MAX; //사용불가
dp[0][1] = graph[0][1]; //시작점
dp[0][2] = graph[0][1] + graph[0][2]; //초기값
for(int i = 1; i < N; i++)
{
dp[i][0] = min({dp[i - 1][0], dp[i - 1][1]}) + graph[i][0]; //좌측
dp[i][1] = min({dp[i - 1][0], dp[i - 1][1], dp[i - 1][2], dp[i][0]}) + graph[i][1]; //중앙
dp[i][2] = min({dp[i - 1][1], dp[i - 1][2], dp[i][1]}) + graph[i][2]; //우측
}
cout << T++ << ". " << dp[N-1][1] << "\n";
}
return 0;
}
시작점이 맨 첫줄의 가운데이므로, 맨 첫줄의 첫번째 값은 사용이 불가능하다.
따라서 무작위 매우 큰수를 대입시켰다.
이후 맨 윗줄들을 초기화 시켜주고 간단한 dp식으로 최단루트를 저장해준다.
dp식은 단순히 갈 수 있는 방향의 가장 작은 값과 해당 정점의 비용을 더한 값을 해당 정점에 저장했다.
'백준 > 실버' 카테고리의 다른 글
[백준 10451번] 순열 사이클 (C++) (0) | 2023.03.21 |
---|---|
[백준 15656번] N과 M (7) (C++) (0) | 2023.03.19 |
[백준 2824번] 최대공약수 (C++) (0) | 2023.03.17 |
[백준 19637번] IF문 좀 대신 써줘 (0) | 2023.03.14 |
[백준 6550번] 부분 문자열 (C++) (0) | 2023.03.12 |