Algorithm/개념
다이나믹 프로그래밍 개념과 예제
vluevy
2022. 5. 4. 11:45
728x90
반응형
다이나믹 프로그래밍
동적할당의 다이나믹과는 다른 개념
- 큰 문제를 작은 문제로 나눌 수 있다
- 작은 문제에서 구한 정답은 그것을 포함하는 큰 문제에서도 동일하다
메모이제이션 기법→ 한 번 구현한 결과를 메모리 공간에 메모해두고 같은 식을 다시 호출하면 메모한 결과를 그대로 가져오는 기법 캐싱이라고도 함
재귀함수를 사용하여 소스코드를 작성하는 방법→ 탑다운방식 반복문을 이용하여 소스코드를 작성하는 방법→ 보텀업방식
1로만들기
x=int(input())
d=[0]*(x+1)
for i in range(2,x+1):
d[i]=d[i-1]+1
if i%2==0:
d[i]=min(d[i],d[i//2]+1)
if i%3==0:
d[i]=min(d[i],d[i//3]+1)
print(d[x])
개미전사
n=int(input())
array= list(map(int,input().split()))
d=[0]*100
d[0]=array[0]
d[1]=max(array[0],array[1])
for i in range(2,n):
d[i]=max(d[i-1],d[i-2]+array[i])
print(d[n-1])
바닥공사
n=int(input())
d=[0]*(n+1)
d[1]=1
d[2]=3
for i in range(3,n+1):
d[i]=d[i-1]+d[i-2]*2
print(d[n])
BOJ 타일채우기
n=int(input())
d=[0]*31
#d=[0]*(n+1) 햇다가 n=1인 경우에서 인덱스 오류남
d[2]=3
for i in range(4,n+1):
if i%2==0:
d[i]=d[i-2]*3+sum(d[:i-2])*2+2
print(d[n])
효율적인 화폐 구성
n,m=map(int,input().split())
array=[]
for i in range(n):
array.append(int(input()))
d=[10001]*(m+1)
d[0]=0
for i in range(n):
for j in range(array[i],m+1):
if d[j-array[i]] != 10001:
d[j]=min(d[j],d[j-array[i]]+1)
if d[m] == 10001:
print(-1)
else:
print(d[m])
BOJ설탕배달
n=int(input())
ans=0
while True:
if n%5==0:
ans+=n//5
print(ans)
break
n-=3
ans+=1
if n<0:
print(-1)
break
효율적인 화폐구성이랑 비슷한 풀이일줄 알았는데 더 쉽게 풀린다
반응형