# 삼각 그래프 import sys input = sys.stdin.readline def solution(): t = 1 while 1: n = int(input().rstrip()) if n == 0: break g = [[] for _ in range(n)] for i in range(n): g[i] = list(map(int, input().rstrip().split())) dp = [[float('inf') for _ in range(3)] for _ in range(n)] dp[0][:2] = g[0][:2] dp[0][2] = dp[0][1]+g[0][2] for i in range(1, n): for j in range(3): if i == 1: if j == 0: dp[i][j] = dp[i-1][1]+g[i][j] else: dp[i][j] = min(dp[i][j-1], min(dp[i-1][1:]))+g[i][j] else: if j == 0: dp[i][j] = min(dp[i-1][0], dp[i-1][1])+g[i][j] elif j == 1: dp[i][j] = min(dp[i][0], min(dp[i-1]))+g[i][j] else: dp[i][j] = min(dp[i][1], dp[i-1][j-1], dp[i-1][j])+g[i][j] print(f'{t}. {dp[n-1][1]}') t += 1 return solution() """ 걸린 시간: 30분 시간 복잡도: n*3 테이블을 모두 채우는 것이기 때문에 O(3n)이다. 해설: 1149번(RGB 집 칠하기) 문제처럼 현재 보는 수까지 오는 최적을 계속 계산하면 된다. 조금 다른 점은 분기 조건이 다르다는 점인데, 오른쪽, 아래, 오른쪽 아래, 왼쪽 아래, 이렇게 총 4가지 방향으로 이동할 수 있다. 또 하나의 고려할 점은 노드 값에 음수도 가능하기 때문에 여러 노드를 거치는 것이 꼭 손해는 아니라는 것이다. 따라서 이것에 맞게 최소값을 찾아와야 하고, 1,2,3열에 따라 올 수 있는 곳이 다르기 때문에 잘 지정해서 해야한다. 또한 시작인 [0][1]이라는 점에 의해서 0,1 행의 노드들은 특수성이 있기 때문에 이 부분들은 직접 체크하고 반복문을 돌리는 것이 낫다. """