------------------------------------------------------------------------------------------------------------------------------------------------------------------------
#include<stdio.h>
#define N 1000000
int dp[N];
void fibo(int n)
{
for (int i = 2; i <= n; i++)
{
dp[i] = dp[i - 1] + 1;
if (i % 2 == 0)
{
if (dp[i] > dp[i / 2] + 1)
dp[i] = dp[i / 2] + 1;
}
if (i % 3 == 0)
{
if (dp[i] > dp[i / 3] + 1)
dp[i] = dp[i / 3] + 1;
}
}
}
int main()
{
int a;
scanf("%d",&a);
fibo(a);
printf("%d",dp[a]);
}
DP 에서 bottom - up 으로 풀었다.
DP는 배열에다 메모이제이션하는 방법으로 동일한 방법의 계산을 반복할때, 이전의 값들을 저장하는 방법인데
이 문제를 보면
입력이 주어졌을때 위의 세가지 규칙들을 이용하여 입력된 수를 1로 최소한의 횟수로 만드는 문제
1에서 1로 만들때 드는 횟수는 당연히 0번 ---> 배열1에는 0삽입
1에서 2로 만들때 드는 방법은 2가지가 있다. 1에서 +1 하는 경우 or 1에서 x2하는 경우 하지만 둘다 횟수 1번으로 동일하기 때문에 --> 배열2에는 1삽입
1에서 3으로 만들때 드는 방법은 2가지 --> 1에서 x3 하는 경우 or 2에서 +1 하는 경우 , 이때 1에서 x3 하는 경우는 횟수가 1번이지만 , 2에서 +1 하는 경우는 횟수가 2번이다. 왜냐하면 1에서 2로 갈때 벌써 횟수1번을 소모했으니 2에서 3으로갈때 총 횟수가 2번이다
그래서 3으로 만들때 드는 가장 최소한의 횟수는 1번이다.(1에서 x3한 방법)
만약 입력이 11이라면 배열은 요로코롬 만들어질것.
'알고리즘 > DP(Dynamic Programming)' 카테고리의 다른 글
연속합 (DP) (2) | 2016.12.22 |
---|---|
파도반 수열 (DP) (0) | 2016.12.21 |
피보나치 수열 2 (DP) (0) | 2016.12.21 |
피보나치 수열 1 (DP) (0) | 2016.12.21 |