컴공생 누르지 마세요! 컴공생 울어요.
[DP] 다이나믹 프로그래밍 (3) 실전 문제 - 개미 전사 ⭐ 본문
이코테 p.220 실전 문제 - 개미 전사
입력 예시
4 1 3 1 5 |
출력 예시
8 |
교재 소스코드
- 왼쪽 식량 창고부터 차례대로 털지 안 털지를 결정하는데, 특정한 i번째 식량 창고를 털지 안 털지를 결정하는 경우의 수는 2가지 존재
- (i - 1)번째 식량 창고를 턴다면 현재 식량 창고는 털 수 없음
- (i - 2)번째 식량 창고를 턴다면 현재 식량 창고를 털 수 있음
- 참고로 (i - 3)번째 이하의 식량 창고는 항상 털 수 있기 때문에 고려할 필요 없음
- 따라서 이 두가지 중에서 더 많은 식량을 털 수 있는 경우 선택
- 구체적인 과정 예시: n = 4, 리스트는 [1, 3, 1, 5]로 주어졌을 때, 왼쪽부터 턴다고 가정
- 첫 번째 식량 창고에서 털 수 있는 최대 식량은 1
- 두 번째 식량 창고에서 털 수 있는 최대 식량은 3
- 세 번째 식량 창고에서 털 수 있는 최대 식량은 max(3, 1 + 1) = 2
- 네 번째 식량 창고에서 털 수 있는 최대 식량은 max(2, 3 + 5) = 8
- 따라서 털 수 있는 식량의 최댓값은 8
- 점화식으로 나타내면
- K를 i번째 식량창고의 식량 개수라고 할 때
- a(i) = max(a(i - 1), a(i - 2) + K)
# 입력받기
n = int(input())
array = list(map(int, input().split()))
# 앞서 계산된 결과를 저장하기 위한 DP 테이블 초기화
dp = [0] * 100
# 다이나믹 프로그래밍 진행 (바텀업 방식)
dp[0] = array[0]
dp[1] = max(array[0], array[1])
for i in range(2, n):
dp[i] = max(dp[i - 1], dp[i - 2] + array[i])
print(dp[n - 1])
'STUDY > 알고리즘' 카테고리의 다른 글
[DP] 다이나믹 프로그래밍 (5) 실전 문제 - 효율적인 화폐 구성 ⭐ (0) | 2023.03.15 |
---|---|
[DP] 다이나믹 프로그래밍 (4) 실전 문제 - 바닥 공사 ⭐ (0) | 2023.03.15 |
[DP] 다이나믹 프로그래밍 (2) 실전 문제 - 1로 만들기 ⭐ (0) | 2023.03.15 |
[DP] 다이나믹 프로그래밍 (1) 개념 (1) | 2023.03.15 |
[이진탐색] 이진탐색 (5) 실전 문제 - 떡볶이 떡 만들기 ⭐ (2) | 2023.03.15 |
Comments