Algorithm
[Algorithm] 백준 1463 1로 만들기 c++
반응형
https://www.acmicpc.net/problem/1463
풀이
DP
- N에서 1을 만드는 방법을 생각하지 않고, 1에서 N을 만드는 방법으로 구현한다. (bottom-up)
N = 1
인 경우f[1]
에0
을 넣고(basecase) 1에서+1, *2, *3
을 했을 때의 값인f[2], f[3]
에1(f[1] + 1
)을 넣는다.- 즉,
f[i+1] = f[i*2] = f[i*3] = f[i] + 1
이다. - 다만 i보다 더 큰 수(j)로부터 최소의 횟수를 만들 수 있으므로
min(f[i] + 1(현재값), f[j] + 1)
으로 값을 업데이트한다. - 주의사항) 1에서 N이 되는 방식으로 구현했기 떄문에 N의 최대인
1000000
에 맞춰 배열 f의 크기를3000003
으로 잡아야 한다. (좋은 방식은 아니겠지만..)
소스코드
#include <iostream>
using namespace std;
int f[3000003];
int dp(int x){
for(int i=1; i<1000001; i++){
if(!f[i+1]) f[i+1] = f[i] + 1;
else f[i+1] = min(f[i+1], f[i] + 1);
if(!f[i*2]) f[i*2] = f[i] + 1;
else f[i*2] = min(f[i*2], f[i] + 1);
if(!f[i*3]) f[i*3] = f[i] + 1;
else f[i*3] = min(f[i*3], f[i] + 1);
}
return f[x];
}
int main(){
int x;
cin>>x;
cout<<dp(x);
return 0;
}
반응형
'Algorithm' 카테고리의 다른 글
[Algorithm] 백준 17298 오큰수 c++ (0) | 2021.09.26 |
---|---|
[Algorithm] 백준 13305 주유소 c++ (0) | 2021.09.23 |
[Algorithm] 백준 9184 신나는 함수 실행 c++ (0) | 2021.09.10 |
[Algorithm] 백준 2580 스도쿠 c++ (0) | 2021.09.09 |
[Algorithm] 백준 9663 N-Queen c++ (0) | 2021.09.06 |