https://www.acmicpc.net/problem/1463
위의 문제에서 입력 값이 10^6를 고려했을 때 O(N^2)의 경우 1초를 넘어가게 된다.
O(N)안에서 풀 수 있는 방법을 생각했을 때 이전의 값을 이용하여 연산의 최소값을 구하는 방식으로 접근해야 한다.
3으로 나누어 떨어질 때 i/3의 값과 i-1의 값 중에 가장 작은 값을 더해주면 되고 2일 때도 같은 방식이다.
만약에 3과 2로 모두 나누어 떨어지지 않는다면 바로 이전 값인 i-1의 값에 1을 더해주는 방식으로 구하면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #include <iostream> #include <algorithm> #include <string.h> using namespace std; int main(){ int n; cin>>n; int* dp=(int*)malloc(sizeof(int)*(n+1)); memset(dp,0,sizeof(dp)); dp[2]=1, dp[3]=1; for(int i=4;i<=n;i++){ if(i%3==0 && i%2==0) dp[i]=min(dp[i/3],dp[i/2])+1; else if(i%3==0){ dp[i]=min(dp[i/3],dp[i-1])+1; }else if(i%2==0){ dp[i]=min(dp[i/2],dp[i-1])+1; }else dp[i]=dp[i-1]+1; } cout<<dp[n]<<endl; free(dp); return 0; } | cs |
'알고리즘(BOJ) > DP' 카테고리의 다른 글
백준 2156번 - 포도주 시식 (0) | 2018.01.25 |
---|---|
백준 11726번 - 2xN 타일링 (0) | 2018.01.25 |
백준 2193번 - 이친수 (0) | 2018.01.25 |
백준 9095번 - 1,2,3 더하기 (0) | 2018.01.25 |
백준 1149번 - RGB거리 (0) | 2018.01.25 |