https://www.acmicpc.net/problem/9507
처음에는 피보나치는 당연히 재귀로 푸는거라고 생각해서 아래처럼 재귀로 코드를 짰다.
#include <iostream>
using namespace std;
int koong(int n) {
if (n < 2) return 1;
else if (n == 2) return 2;
else if (n == 3) return 4;
else return koong(n - 1) + koong(n - 2) + koong(n - 3) + koong(n - 4);
}
int main() {
int t;
cin >> t;
while (t--) {
int n;
cin >> n;
cout << koong(n) << "\n";
}
return 0;
}
그런데 이 코드는 시간 초과가 떴다.
알고 보니 재귀로 풀게 되면 큰 수에서는 너무 가지를 많이 뻗게 되어서 시간이 오래 걸리는 것이었다. 따라서 이를 DP로 고쳐보았다. 아래 코드에서는 미리 0~67까지 다 계산해놓고 바로바로 답을 꺼내 쓰는 방식으로 작동한다.
#include <iostream>
#include <vector>
using namespace std;
int main() {
int t;
cin >> t;
vector<long long> dp(68);
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
dp[3] = 4;
for (int i = 4; i <= 67; i++) {
dp[i] = dp[i-1] + dp[i-2] + dp[i-3] + dp[i-4];
}
while (t--) {
int n;
cin >> n;
cout << dp[n] << "\n";
}
return 0;
}