문제📖
![](https://velog.velcdn.com/images%2Fcosmos%2Fpost%2F74dd9a77-3022-44b8-ba95-fcc4a262f0ce%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-22%20%E1%84%8B%E1%85%A9%E1%84%8C%E1%85%A5%E1%86%AB%2011.28.41.png)
풀이🙏
- 첫째 줄에 삼각형의 크기 n(1 <= n <= 500)이 주어지고, 둘때 줄부터 n+1번째 줄까지 정수 삼각형이 주어진다.
- 맨 위층부터 시작하여 아래에 있는 수 중 하나를 선택하여 아래층으로 내려올 때, 이제까지 선택된 수의 합이 최대가 되는 경로를 구하는 프로그램을 작성하라.
- 아래층에 있는 수는 현재층에서 선택된 수의 대각선 왼쪽 또는 대각선 오른쪽에 있는 것 중에서만 선택할 수 있다.
- 첫째 줄에 합이 최대가 되는 경로에 있는 수의 합을 출력하라.
- DP 알고리즘 문제이다.
- dp는 큰 문제를 작은 문제로 나누어서 풀 수 있으며 처음에 단계를 배열로 할당한 뒤, 각 단계를 비교하는 방식에 수월하다.
코드💻
import sys
def DP(triangle):
for i in range(1, n):
for j in range(len(triangle[i])):
if j == 0:
triangle[i][j] = triangle[i-1][j] + triangle[i][j]
elif j == len(triangle[i]) - 1:
triangle[i][j] = triangle[i-1][-1] + triangle[i][j]
else:
triangle[i][j] = max(triangle[i-1][j-1], triangle[i-1][j]) + triangle[i][j]
return max(triangle[n-1])
n = int(sys.stdin.readline())
triangle = [list(map(int, input().split())) for _ in range(n)]
print(DP(triangle))
결과😎
![](https://velog.velcdn.com/images%2Fcosmos%2Fpost%2Fc2b788fc-ce44-44aa-b227-6c847bfecb5c%2F%E1%84%89%E1%85%B3%E1%84%8F%E1%85%B3%E1%84%85%E1%85%B5%E1%86%AB%E1%84%89%E1%85%A3%E1%86%BA%202021-03-22%20%E1%84%8B%E1%85%A9%E1%84%92%E1%85%AE%2012.00.24.png)
출처 && 깃허브📝
https://www.acmicpc.net/problem/1932
github