Пожалуйста помогите с задачей. Задача про Калькулятор с восстановлением ответа и именно восстановление ответа у меня не получается

n = int(input())
F = [0] * (n + 1)
for i in range(2, n + 1):
    F[i] = F[i - 1]
    if i % 2 == 0:
        F[i] = min(F[i], F[i // 2])
    if i % 3 == 0:
        F[i] = min(F[i], F[i // 3])
    F[i] += 1
 print(F[n])

В моём коде выводится только наименьшее количество операций, но как сделать с восстановлением ответа я не знаю, пожалуйста подскажите. Вот сама задача: введите сюда описание изображения введите сюда описание изображения


Ответы (2 шт):

Автор решения: MBo

Что происходит в строчках c min? Выбор того какое действие приводит к наилучшему результату для данного значения.

Вот и стоит вместо использования функции min делать своё сравнение, чтобы кроме выбора минимума, в параллельный список записывать номер ячейки, из которой пришли в данную (или F сделать списком списков из двух элементов, где второй будет содержать номер ячейки, из которой пришли в данную)

После прохода размотать назад наилучший путь, начиная с последнего элемента

→ Ссылка
Автор решения: Stanislav Volodarskiy

В таблице F достатчно данных чтобы восстановить цепочку шагов. Для шага n отыскать предыдущий можно так:

если в ячейке n - 1 число на единицу меньше, то это нужный шаг
если n делится на 2 и в ячейке n // 2 число на единицу меньше, то это нужный шаг
если n делится на 3 и в ячейке n // 3 число на единицу меньше, то это нужный шаг
другого быть не может

Шаги отыскиваются задом наперёд. При печати их надо развернуть:

...

chain = []
while n > 1:
    chain.append(n)
    if F[n] == F[n - 1] + 1:
        n -= 1
    elif n % 2 == 0 and F[n] == F[n // 2] + 1:
        n //= 2
    elif n % 3 == 0 and F[n] == F[n // 3] + 1:
        n //= 3
    else:
        assert False
chain.append(1)
print(*chain[::-1])
→ Ссылка