나동빈문제 - 개미전사 파이썬

임규성·2022년 6월 11일
0
post-custom-banner

문제는 이렇다.


먼저 이문제를 처음봤다면 과연 dp로 풀 생각이 났을지는 모르겠지만, 만약 dp로 풀 수 있을려면
이문제의 조건이 dp의 조건을 만족하는지 확인해봐야 되었다.
먼저 이문제를 dp로 풀수있는지 확인해 보려면 i번째까지 식량창고에서 약탈할 수있는 최대양이 i-1이하의 최대양과 연관이 있는가? 라는 질문에서 시작해봐야한다.

고민해본결과

f(x)라은 함수를 x까지 식량창고의 약탈할 수 있는 최대양이라하면
f(x)는 x-1번째의 식량을 약탈했는지 확인해봐야 한다.

x-1번째를 약탈 했다면

f(x) == f(x-1)이고

x-1번째를 약탈 하지않았다면

f(x) == f(x- 2) + max(array[x-1], array[x])
일 것임이 분면하다.

이 두개의 근거를 고려해보면
접화식을 나타낼 수 잇는데

f(x) == f(x-2) + max(array[x-1]), array[X])

가 성립함을 알수있고, 따라서 이문제는 dp로 풀 수 있게된다!!!!!!

이를 기반으로 코드를 작성해본다면

#입력
#첫째줄 식량창고의 개수 N (3 <= N <= 100)
#둘째줄 N개의 각 식량창고의 식량의 양 K (0 <= K <= 1000)


#점화식
# f(i) = f(i-2) + max(array[i-1], array[i])일 것이다.
# f(1) = array[i]
# f(2) = max(array[1],  array[2])

import sys
import time
d = [0] * 1001

def food_max(flist, N):
  if(N == 1):
    d[1] = flist[0]
    return flist[0]
  if(N == 2):
    d[2] = max(flist[0], flist[1])
    return max(flist[0], flist[1])

  if d[N] != 0:
    return d[N]
  d[N] = food_max(flist, N-2) + max(flist[N-1], flist[N-2])
  return d[N]

N = int(input())

food_storage = list(map(int, sys.stdin.readline().split()))

start = time.time()
print(food_max(food_storage, N))

print('걸린시간 : ', time.time() - start)

이렇게된다.
따라서 이문제를 풀 수 있게된다. 이문제는 dp로 풀 수 있는지를 알아내면 편하게 풀 수 있는 문제이다.

profile
삶의 질을 높여주는 개발자
post-custom-banner

0개의 댓글