
# 피보나치 수열을 재귀함수로 표현
def fibo(x):
if x == 1 or x == 2:
return 1
return fibo(x-1) + fibo (x-2)
print(fibo(4))
실행결과
1
d= [0] * 100
# 피보나치 수열을 재귀함수로 표현(탑다운 다이나믹 프로그래밍)
def fibo(x):
if x == 1 or x == 2:
return 1
if d[x]==0:
return d[x]:
d[x] = fibo(x-1) + fibo (x-2)
return d[x]
print(fibo(4))
d= [0] * 100
d[1] = 1
d[2] = 2
n = 99
# 피보나치 함수 반복문으로 구현(보텀업 다이나믹 프로그래밍)
for i in range(3, n+1):
d[i] = d[i-1] + d[i-2]
print(d[n])

x = int(input())
d = [0] * 30001
# 다이나믹 프로그래밍(Dynamic programming) 진행(보텀업)
for i in range(2, x+1):
d[i] = d[i-1] + 1
if i % 2 == 0:
d[i] = max(d[i], d[i//2]+1)
if i % 3 == 0:
d[i] = max(d[i], d[i//3]+1)
if i % 5 == 0:
d[i] = max(d[i], d[i//5]+1)
print(d[x])

n, m = map(int,input().split())
array = []
for i in range(n):
array.append(int(input()))
d = [10001] * (m+1)
# 다이나믹 프로그래밍(Dynamic Programming) 진행(보텀업)
d[0] = 0
for i in range(n):
for j in range(array[i], m+1):
if d[j-array[i]] != 10001: # (i-k)원을 만드는 방법이 존재하는 경우
d[j] = min(d[j], d[j-array[i]] + 1)
if d[m] == 10001:
print(-1)
else:
print(d[m])
문제
n x m 크기의 금광이 있습니다. 금광은 1 x 1 크기의 칸으로 나누어져 있으며, 각 칸은 특정한 크기의 금이 들어 있습니다. 채굴자는 첫 번째 열부터 출발하여 금을 캐기 시작합니다. 맨 처음에는 첫 번째 열의 어느 행에서든 출발할 수 있습니다. 이후에 m번에 걸쳐서 매번 오른쪽 위, 오른쪽, 오른쪽 아래 3가지 중 하나의 위치로 이동해야 합니다. 결과적으로 채굴자가 얻을 수 있는 금의 최대 크기를 출력하는 프로그램을 작성하세요.
만약 다음과 같이 3 x 4 크기의 금광이 존재한다고 가정합시다.
가장 왼쪽 위의 위치를 (1, 1), 가장 오른쪽 아래의 위치를 (n, m)이라고 할 때, 위 예시에서는 (2, 1) → (3, 2) → (3, 3) → (3, 4)의 위치로 이동하면 총 19만큼의 금을 채굴할 수 있으며, 이때의 값이 최댓값입니다.

T = int(input())
for i in range(T):
graph = []
n, m = map(int,input().split())
graph =list(map(int,input().split()))
#graph = [[1, 3, 3, 2, 2, 1, 4, 1, 0, 6, 4, 7]]
dp = [[0]*m for _ in range(n)]
#2차원 배열 형태로 바꾸기(dp 초기화)
for i in range(n):
for j in range(m):
dp[i][j] = graph[i*m+j]
#dp = [[1, 3, 3, 2], [2, 1, 4, 1], [0, 6, 4, 7]]
for j in range(1,m):
for i in range(n):
#왼쪽 위에서 오는 경우
if i == 0:
left_up = 0
else:
left_up = dp[i-1][j-1]
#왼쪽 아래에서 오는 경우
if i == n-1:
left_down = 0
else:
left_down = dp[i+1][j-1]
#왼쪽에서 오는 경우
left = dp[i][j-1]
dp[i][j] = dp[i][j] + max(left_up, left_down, left)
result = 0
for i in range(n):
result = max(result,dp[i][m-1])
print(result)]
이 문제의 기본 아이디어는 가장 긴 증가하는 부분 수열(Longest Increasing Subsequence, LIS)로, 전형적인 다이나믹 프로그래밍 문제의 아이디어와 동일함.
문제
N명의 병사가 무작위로 나열되어 있다. 각 병사는 특정한 값의 전투력을 보유하고 있으며, 병사를 배치할 때는 전투력이 높은 병사가 앞쪽에 오도록 내림차순으로 배치를 하고자 한다. 다시 말해 앞쪽에 있는 병사의 전투력이 항상 뒤쪽에 있는 병사보다 높아야 한다.
또한 배치 과정에서는 특정한 위치에 있는 병사를 열외시키는 방법을 이용한다. 그러면서도 남아있는 병사의 수가 최대가 되도록 하고 싶다.
예를 들어, N=7일 때 나열된 병사들의 전투력이 다음과 같다고 가정하자.
이 때 3번 병사와 6번 병사를 열외시키면, 다음과 같이 남아있는 병사의 수가 내림차순의 형태가 되며 5명이 된다. 이는 남아있는 병사의 수가 최대가 되도록 하는 방법이다.
병사에 대한 정보가 주어졌을 때, 남아있는 병사의 수가 최대가 되도록 하기 위해서 열외해야 하는 병사의 수를 출력하는 프로그램을 작성하시오.
n = int(input())
array =list(map(int,input().split()))
array.reverse()
dp = [1] * n
# 가장 긴 증가하는 부분 수열(LTS) 알고리즘 수행
for i in range(1,n):
for j in range(0,i):
if array[j] < array[i]:
dp[i] = max(dp[i], dp[j] + 1)
# 열외해야 하는 병사의 최소 수
print(n - max(dp))