어디까지 갈 수 있을까?

chapter 8. 다이나믹 프로그래밍 본문

알고리즘/이것이취업을위한코딩테스트다

chapter 8. 다이나믹 프로그래밍

_Min 2021. 2. 22. 11:26

큰 문제를 작은 문제로 나눠,

현재 계산된 수들을 바탕으로 앞으로의 값을 계산하는 프로그래밍이다

중복되는 연산을 피하기 위해 DP테이블에 계산해 놓은 값을 저장해놓는 (메모이제이션 = 캐싱) 기법 을 이용한다

시간복잡도는 O(logn)이다

 

탑다운 방식

재귀 함수 이용

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
d=[0]*100
 
def fibo(x):
    if x<=1:
        return 1
 
    #이미 계산한 문제라면 그대로 반환
    if d[x]!=0:
        return d[x]
 
    #아직 계산하지 않은 문제
    d[x] = fibo(x-1+ fibo(x-2)
    return d[x]
 
print(fibo(99))
cs

 

 

 

바텀업 방식

반복문 이용

1
2
3
4
5
6
7
8
9
10
d=[0]*100
 
d[1]=1
d[2]=1
n=99
 
for i in range(3, n+1):
    d[i]=d[i-1]+d[i-2]
 
print(d[n])
cs

 

 

 

 

 

1로 만들기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
input=sys.stdin.readline
 
n=int(input())
d=[0]*(n+1)
 
for i in range(2, n+1):
    d[i]=d[i-1]+1
 
    if i%5==0 and d[i]>d[i//5]+1:
        d[i] = d[i//5]+1
    elif i%3==0 and d[i]>d[i//3]+1:
        d[i] = d[i//3+ 1
    elif i%2==0 and d[i]>d[i//2]+1:
        d[i] = d[i//2+ 1
 
print(d[n])
cs

 

 

 

개미전사

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import sys
input=sys.stdin.readline
 
n=int(input().rstrip())
arr=list(map(int, input().split()))
d=[0]*n
d[0]=arr[0]
d[1]=max(arr[0], arr[1])
 
#전 창고 vs 전전창고+현재값
for i in range(2, n):
    d[i]=max(d[i-1], d[i-2]+arr[i])
 
print(d[n-1])
 
 
 
cs

 

 

 

바닥공사

1
2
3
4
5
6
7
8
9
10
11
import sys
input=sys.stdin.readline
 
n=int(input())
d=[0,1,3]+[0]*(n-2)
 
for i in range(3, n+1):
    d[i]=(d[i-2]*2+d[i-1])%796796
 
print(d[n])
 
cs

 

 

 

효율적인 화폐 구성

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import sys
input=sys.stdin.readline
 
n, m = map(int, input().split())
val = [int(input()) for _ in range(n)]
= [10001]*10001
d[0= 0
for v in val:
    for j in range(v, m+1):
        d[j] = min(d[j], d[j-v]+1)
if d[m]==10001:
    print(-1)
else:
    print(d[m])
cs
728x90

'알고리즘 > 이것이취업을위한코딩테스트다' 카테고리의 다른 글

chapter 9. 최단 경로(다익스트라)  (0) 2021.02.23
다이나믹 프로그래밍 문제  (0) 2021.02.22
이진탐색 문제  (0) 2021.02.19
chaper 7. 이진 탐색  (0) 2021.02.19
정렬 문제  (0) 2021.02.17
Comments