문제 링크 - https://www.acmicpc.net/problem/1463
🌱 문제
🌱 풀이
- d[n]= min(d[n/3],d[n/2],d[n-1])+1 라는 점화식이 성립한다.
- 식 그대로 함수로 구현하면 된다.
- 디피문제는 top-down 방식과 bottom-up 방식으로 구현할 수 있다.
top-down
방식: 큰 문제를 해결하기 위해 작은 문제를 호출하는 방식. 보통 재귀 이용
bottom-up
방식: 가장 작은 문제들로부터 답을 구해가며 전체 문제의 답을 찾아가는 방식. 보통 반복문 이용
🌱 코드
#include <iostream>
#include <cmath>
using namespace std;
int n;
int d[1000001];
int dp1(int n){
if(n==1)
return 0;
d[n]=dp1(n-1)+1;
if(n%3==0){
int value = d[n/3]+1;
if(d[n]>value){
d[n]=value;
}
}
if(n%2==0){
int value=d[n/2]+1;
if(d[n]>value){
d[n]=value;
}
}
return d[n];
}
int dp2(int n){
d[1]=0;
for(int i=2; i<=n; i++){
d[i]=d[i-1]+1;
if(i%3==0){
int temp=d[i/3]+1;
if(d[i]>temp){
d[i]=temp;
}
}
if(i%2==0){
int temp=d[i/2]+1;
if(d[i]>temp){
d[i]=temp;
}
}
}
return d[n];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
cin>>n;
cout<<dp2(n)<<"\n";
}
읽어본 블로그
https://velog.io/@kimdukbae/%EB%8B%A4%EC%9D%B4%EB%82%98%EB%AF%B9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D-Dynamic-Programming