Моя группа изо всех сил пыталась найти хороший алгоритм, но все, что мы могли придумать, было экспоненциальным. Есть ли способ сделать это быстрее? Вот полный вопрос:
Определить функцию
function F(n:Integer):Integer;
который будет вычислять число различных представлений неотрицательного числа n в виде суммы чисел Фибоначчи с неравными положительными индексами. Например (Fib (k) означает k-е число Фибоначчи):
Р (0) = 0
F (1) = 2, так как 1 = Fib (1) = Fib (2)
F (2) = 2, так как 2 = Fib (3) = Fib (1) + Fib (2)
(3) + Fib (1) = Fib (3) + Fib (2)и т.д.
Я думаю, что первым, неизбежным шагом является создание массива n чисел Фибоначчи, что-то вроде этого:
Fib[1]:=1;
Fib[2]:=1;
for i:=3 to n do
Fib[i]:=Fib[i-1]+Fib[i-2];
Конечно, мы могли бы оптимизировать его, вычислив только те числа Фибоначчи, которые меньше или равны n, но это не помогло бы, так как в любом случае динамические массивы не были разрешены. Итак, как мы можем продолжать избегать экспоненциальной временной сложности?