4883-s1 성공
This commit is contained in:
54
workbook_7319/silver/4883-s1.py
Normal file
54
workbook_7319/silver/4883-s1.py
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
# 삼각 그래프
|
||||||
|
|
||||||
|
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 행의 노드들은 특수성이 있기 때문에 이 부분들은 직접 체크하고 반복문을 돌리는 것이 낫다.
|
||||||
|
"""
|
||||||
Reference in New Issue
Block a user