Динамическое программирование
Идея американского математика Беллмана при решении сложных многошаговых задач оптимизации: оптимальная последовательность шагов оптимальна на любом участке.
На практике динамическое программирование часто сводится к хранению в памяти решения задач меньшей размерности.
С помощью динамического программирования решаются задачи, которые требуют полного перебор вариантов:
Способ решения задач сложных задач путем сведения их к более простым подзадачам того же типа.
Задача 1. Восхождение по лестнице�
Вы поднимаетесь по лестнице. Чтобы добраться до вершины, нужно преодолеть n ступенек. За один шаг вы можете подниматься на одну или на две ступеньки.
Вопрос: сколько существует различных способов подняться на 10 ступенек?
Задача 1. Восхождение по лестнице�
Вы поднимаетесь по лестнице. Чтобы добраться до вершины, нужно преодолеть n ступенек. За один шаг вы можете подниматься на одну или на две ступеньки.
Вопрос: сколько существует различных способов подняться?
1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 5 | |
Для 3:
Первый способ: 1, 1, 1.�Второй способ: 1, 2.�Третий способ: 2, 1.
Для 2:
Первый способ: 1, 1.�Второй способ: 2.�
Для 4:
Первый способ: 1, 1, 1, 1.�Второй способ: 1, 2, 1.�Третий способ: 2, 1, 1�Четвертый способ: 1, 1, 2�Пятый способ: 2, 2.
Задача 1. Восхождение по лестнице�
Вы поднимаетесь по лестнице. Чтобы добраться до вершины, нужно преодолеть n ступенек. За один шаг вы можете подниматься на одну или на две ступеньки.
Вопрос: сколько существует различных способов подняться?
1 | 2 | 3 | 4 | 5 |
1 | 2 | 3 | 5 | 8 |
6 | 7 | 8 | 9 | 10 |
13 | 21 | 34 | 55 | 89 |
Задача 1. Восхождение по лестнице�
Вы поднимаетесь по лестнице. Чтобы добраться до вершины, нужно преодолеть n ступенек. За один шаг вы можете подниматься на одну или на две ступеньки.
Вопрос: сколько существует различных способов подняться?
def stairs(n):
if n == 1:
return 1
if n == 2:
return 2
a, b = 1, 2
for _ in range(2, n):
b = a + b
a = b - a
return b
Задача 2. 23 задание ЕГЭ�
Демо-2021. Исполнитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя – это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 20, и при этом траектория вычислений содержит число 10?
Задача 2. 23 задание ЕГЭ�
Демо-2021. Исполнитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя – это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 20, и при этом траектория вычислений содержит число 10?
N | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
KN | 1 | 2 | 2 | 4 | 4 | 6 | 6 | 10 | 10 | 14 |
N | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
KN | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 28 |
Задача 2. 23 задание ЕГЭ�
Демо-2021. Исполнитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя – это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 20, и при этом траектория вычислений содержит число 10?
N | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
KN | 1 | 2 | 2 | 4 | 4 | 6 | 6 | 10 | 10 | 14 |
N | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
KN | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 28 |
Задача 2. 23 задание ЕГЭ�
Демо-2021. Исполнитель преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя – это последовательность команд.
Сколько существует программ, для которых при исходном числе 1 результатом является число 20, и при этом траектория вычислений содержит число 10?
N | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
KN | 1 | 2 | 2 | 4 | 4 | 6 | 6 | 10 | 10 | 14 |
N | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
KN | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 14 | 28 |
a =[0]*11 # массив от 0 - 10
# табличка от 1 до 10
a[1] = 1
for i in range(2,10+1):
if i%2==0:
a[i] = a[i-1] + a[i//2]
else: a[i] = a[i-1]
b =[0]*21 # массив от 0 - 20
# табличка от 10 до 20
b[10] = a[-1]
# b[10] = 1
for i in range(11,20+1):
if i%2==0 and i>=20:
b[i] = b[i-1] + b[i//2]
else: b[i] = b[i-1]
print(b[20])
# print(a[10]*b[20])
# print(a[-1]*b[-1])
N | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 |
KN | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 2 |
Домашнее задание
2) Исполнитель Июнь15 преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Умножить на 2
Первая команда увеличивает число на экране на 1, вторая умножает его на 2. Программа для исполнителя Июнь15 – это последовательность команд. Сколько существует программ, для которых при исходном числе 2 результатом является число 29 и при этом траектория вычислений содержит число 14 и не содержит числа 25? 13
1) Исполнитель Июнь15 преобразует число на экране. У исполнителя есть две команды, которым присвоены номера:
1. Прибавить 1
2. Прибавить 2
3. Прибавить 3
Программа для исполнителя Июнь15 – это последовательность команд. Сколько существует программ, для которых при исходном числе 4 результатом является число 15 и при этом траектория вычислений содержит число 8? 308