티스토리 뷰
https://www.acmicpc.net/problem/1463
1로 만드는 최소 연산 횟수는 1에서 N까지 만드는 최소 연산 횟수와 같다. 이를 d[i]이라 하면 이전에 올 수 있는 연산들 중 최소에 1을 더하면 된다. d[i]=min(d(i-1],d[i/3],d[i/2])+1
Top-Down 구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <cstdio> #include <algorithm> using namespace std; int n,d[1000001]; int go(int n) { if(n==1 || d[n]) return d[n]; d[n]=go(n-1)+1; if(n%3==0) d[n]=min(d[n],go(n/3)+1); if(n%2==0) d[n]=min(d[n],go(n/2)+1); return d[n]; } int main() { scanf("%d",&n); printf("%d",go(n)); return 0; } | cs |
Bottom-Up 구현
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | #include <cstdio> int n,d[1000001]; int main() { for(int i=2;i<1000001;i++) { d[i]=d[i-1]+1; if(i%3==0 && d[i/3]+1<d[i]) d[i]=d[i/3]+1; if(i%2==0 && d[i/2]+1<d[i]) d[i]=d[i/2]+1; } scanf("%d",&n); printf("%d",d[n]); return 0; } | cs |
'Algorithm > BOJ' 카테고리의 다른 글
1753 최단경로 (0) | 2018.03.03 |
---|---|
1149 RGB거리 (0) | 2018.03.02 |
1003 피보나치 함수 (0) | 2018.03.01 |
1526 가장 큰 금민수 (0) | 2018.02.28 |
1431 시리얼 번호 (0) | 2018.02.27 |