오늘도 계속되는 dynamic programming!
n=int(input())
data=[]
for i in range(n):
data.append(int(input()))
dp=[0]*n
dp[0]=data[0]
if n>1:
dp[1]=data[0]+data[1]
if n>2:
dp[2]=max(data[0]+data[2], data[1]+data[2], data[0]+data[1])
for i in range(3,n):
dp[i]=max(dp[i-2]+data[i],dp[i-3]+data[i-1]+data[i],dp[i-1])
print(dp[n-1])
이 문제에서는, 3번 연속으로 와인을 마시면 안된다.
그렇기에, 3개 이상의 와인이 시식 가능할 때,
i-3 i-2 i-1 i
i-3 i-2 i-1 i
i-3 i-2 i-1 i
(볼드체는 dp에서, 볼드체 및 밑줄은 data. 즉 해당 index의 와인을 구매하는 것이다.)
이 문제가 특히 더 어려웠던 건, 2칸 이상 띄어서 와인을 먹을 수 있기 때문이다.
예를 들면, 100 100 1 1 1000 같은 경우에는,
100 100 1000을 먹는게 제일 좋다.
이런 경우를 위해서 '2개 먹고 하나 쉬고' 하는 것은 best한 전략은 아닌 것이다.
오늘도 화이팅.!
'Computer Science > Algorithm' 카테고리의 다른 글
BOJ 3085: 사탕 게임 (0) | 2022.01.06 |
---|---|
BOJ 1932: 정수 삼각형 (0) | 2022.01.06 |
BOJ 11057: 오르막 수 (+중복조합 야매) (0) | 2022.01.04 |
BOJ 11053: 가장 긴 증가하는 부분 수열 (0) | 2022.01.02 |
BOJ 11053: 가장 긴 증가하는 부분 수열 (0) | 2022.01.02 |