Классический пример динамического программирования
def fib_rec(n, memo={}):
if n <= 1:
return n
if n in memo:
return memo[n]
memo[n] = fib_rec(n-1, memo) + fib_rec(n-2, memo)
return memo[n]
n = int(input())
print(fib_rec(n))
#include <bits/stdc++.h>
using namespace std;
vector<long long> memo;
long long fib_rec(int n) {
if (n <= 1) return n;
if (memo[n] != -1) return memo[n];
return memo[n] = fib_rec(n-1) + fib_rec(n-2);
}
int main() {
int n;
cin >> n;
memo.assign(n + 1, -1);
cout << fib_rec(n) << endl;
return 0;
}
n = int(input())
dp = [0] * (n + 1)
dp[0] = 0
dp[1] = 1
for i in range(2, n + 1):
dp[i] = dp[i-1] + dp[i-2]
print(dp[n])
#include <bits/stdc++.h>
using namespace std;
int main() {
int n;
cin >> n;
vector<long long> dp(n + 1);
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
cout << dp[n] << endl;
return 0;
}
Числа Фибоначчи — это последовательность, в которой каждое следующее число равно сумме двух предыдущих: F(0) = 0, F(1) = 1, F(n) = F(n-1) + F(n-2).
Задача идеально подходит для демонстрации динамического программирования, так как наивная рекурсия многократно вычисляет одни и те же подзадачи.
Временная сложность: O(n) — каждое число вычисляется один раз.
Пространственная сложность: O(n) для массива memo/dp или O(1) для оптимизированного варианта (хранить только два последних числа).
Ввод:
n — номер числа Фибоначчи (0-индексация)Вывод:
10
Вывод: 55
Ряд Фибоначчи: F(0)=0, F(1)=1, F(2)=1, F(3)=2, F(4)=3, F(5)=5, F(6)=8, F(7)=13, F(8)=21, F(9)=34, F(10)=55
Введите номер числа Фибоначчи: