728x90
다른 코드 참조: O, 푼 횟수: 4
풀이과정
먼저 위의 문제와 같은 삼각형이 주어졌다고 가정할 때, 반복문을 이용해 최댓값을 구한다면
1. 7-3-8-2-4
2. 7-3-8-2-5
3. 7-3-8-7-5
...
16. 7-8-0-4-5
이런식으로 전개되고 1~3에서와 같이 7-3-8 이 계속해서 반복되는 비효율이 발생한다. 따라서 동적 계획법을 이용해야 한다.
먼저, t[r][c] = 삼각형 r번째 줄, c번째 칸, dp[i][k] = t[i][k]까지의 합의 최댓값이라고 하자.
데이터가 추가된다고 할 때, 그 데이터에 도달할 수 있는 데이터는 다음과 같은 경우가 있다.
만약 삼각형의 양쪽 끝쪽 데이터의 경우(i번째 줄 0번 칸 or i번칸)를 제외하고 본다면, 추가되는 칸까지의 최대합은 dp[i-1][k-1]과 dp[i-1][k]중 큰 값과 추가되는 데이터를 더한 값이다. (dp[i][k] = max(dp[i-1][k-1], dp[i-1][k]) + t[i][k])
그리고 양쪽 끝쪽 데이터는 그 이전칸까지의 합에서 추가되는 데이터를 더하면 된다.
코드
import sys
n = int(sys.stdin.readline())
t = [list(map(int, sys.stdin.readline().split())) for i in range(n)]
dp = [[0 for i in range(n)] for i in range(n)]
for i in range(n):
for ii in range(i+1):
if i == 0:
dp[0][0] = t[0][0]
elif ii == 0:
dp[i][0] = t[i][0] + dp[i-1][0]
elif ii == i:
dp[i][ii] = t[i][ii] + dp[i-1][ii-1]
else:
dp[i][ii] = t[i][ii] + max(dp[i-1][ii-1], dp[i-1][ii])
print(max(dp[n-1]))
반응형
'알고리즘 > BAEKJOON' 카테고리의 다른 글
[백준] 1918: 후위 표기식 (0) | 2024.01.30 |
---|---|
[백준] 2206: 벽 부수고 이동하기 (1) | 2024.01.26 |
[백준] 11401: 이항 계수 3 - 분할 정복, 페르마의 소정리 (1) | 2023.10.14 |
[백준] 1912: 연속합 - 동적 계획법 (0) | 2023.10.10 |
[백준] 2580: 스도쿠 - 백트래킹 (0) | 2023.10.09 |