피보나치 함수
12 July 2019
문제 : https://www.acmicpc.net/problem/1003
이번은 동적 계획법으로 피보나치 수에서 0과 1의 호출횟수를 구하는 문제를 풀어보도록 하겠습니다.
#include<stdio.h>
int main(void);
void init();
int fibonacci(int n);
static int* zero_count = new int[40];
static int* one_count = new int[40];
static int* cache = new int[40];
int main(void) {
int size, val;
scanf("%d", &size);
for (int i = 0; i < size; i++)
{
init();
scanf("%d", &val);
fibonacci(val);
printf("%d %d\n", zero_count[val], one_count[val]);
}
return 0;
}
void init()
{
for (int i = 0; i < 40; i++)
{
zero_count[i] = 0;
one_count[i] = 0;
cache[i] = 0;
}
cache[1] = 1;
zero_count[0] = 1;
one_count[0] = 0;
zero_count[1] = 0;
one_count[1] = 1;
}
int fibonacci(int n) {
if (n == 0) {
return 0;
}
else if (n == 1) {
return 1;
}
else {
if (cache[n] != 0)
{
return cache[n];
}
else {
int val = fibonacci(n - 1) + fibonacci(n - 2);
zero_count[n] = zero_count[n-1] + zero_count[n-2];
one_count[n] = one_count[n - 1] + one_count[n - 2];
cache[n] = val;
return val;
}
}
}
이번은 피보나치 수열을 동적계획법으로 그대로 표현하여 풀어주도록 합니다.다만, 해당 피보나치 수열의 값만을 저장하지 않고 해당 피보나치 수열 값을 얻을 때 0과 1을 몇번 호출하는지도 같이 저장해줍니다.
예를 들면, 4를 구할 때는 3을 구할때와 2를 구할때 0,1을 호출해준 횟수를 더한 값과 같으므로 동일하게 저장해 return해주도록 합니다.