⚙️ Алгоритмы  ·  20 вопросов  ·  ~45 мин  ·  ⏱ Таймер 45:00  ·  Сложный  · 

Динамическое программирование

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

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Выбери один ответ из четырёх. В тесте 20 вопросов и 45 минут. После завершения откроются общий процент, четыре тематические шкалы, правильные ответы и пояснения.
Вопрос 1 из 20
Что означает dp[i] в этой программе?
Python
dp = [0] * (n + 1)
dp[0] = 1
for i in range(1, n + 1):
    if i >= 1:
        dp[i] += dp[i - 1]
    if i >= 2:
        dp[i] += dp[i - 2]
Вопрос 2 из 20
Какое состояние достаточно для минимальной стоимости пути по прямоугольной сетке с ходами вправо и вниз?
Python
cost = [
    [4, 1, 7],
    [2, 5, 1],
    [3, 2, 6],
]
rows, cols = len(cost), len(cost[0])
dp = [[float('inf')] * cols for _ in range(rows)]
# Нужно определить смысл dp[i][j] для пути из (0, 0)
# с ходами только вправо и вниз.
Вопрос 3 из 20
Для 0/1-рюкзака стандартное состояние dp[i][w] обычно означает:
Вопрос 4 из 20
Почему одной координаты позиции недостаточно в задаче пути с ограничением «можно разрушить не более одной стены»?
Python
from collections import deque

start = (0, 0, 0)  # строка, столбец, число разрушенных стен
queue = deque([start])
visited = {start}
while queue:
    row, col, broken = queue.popleft()
    for nr, nc in neighbours(row, col):
        next_broken = broken + (grid[nr][nc] == '#')
        if next_broken <= 1:
            state = (nr, nc, next_broken)
            if state not in visited:
                visited.add(state)
                queue.append(state)
Вопрос 5 из 20
Какое состояние естественно для длины наибольшей возрастающей подпоследовательности, заканчивающейся в i?
dp_i=1+\max_{j<i,\ a_j<a_i}dp_j
Вопрос 6 из 20
Какое значение dp[5] будет вычислено?
dp[x]=\min_{c\le x}\bigl(dp[x-c]+1\bigr)
Python
coins = [1, 3, 4]
INF = 10**9
dp = [0] + [INF] * 6
for amount in range(1, 7):
    for coin in coins:
        if coin <= amount:
            dp[amount] = min(dp[amount], dp[amount - coin] + 1)
print(dp[5])
Вопрос 7 из 20
Какой переход считает число путей по сетке без препятствий?
Python
rows, cols = 4, 5
dp = [[0] * cols for _ in range(rows)]
dp[0][0] = 1
for i in range(rows):
    for j in range(cols):
        if i == 0 and j == 0:
            continue
        # Здесь нужно выразить dp[i][j]
        # через уже вычисленные соседние клетки.
Вопрос 8 из 20
В 0/1-рюкзаке при одномерной таблице почему вместимость w перебирают по убыванию?
Вопрос 9 из 20
Какое значение получится для dp[3]?
Python
a = [3, 1, 2, 5]
dp = [1] * len(a)
for i in range(len(a)):
    for j in range(i):
        if a[j] < a[i]:
            dp[i] = max(dp[i], dp[j] + 1)
print(dp[3])
Вопрос 10 из 20
Как формулируется переход редакционного расстояния при разных последних символах?
Вопрос 11 из 20
Сколько способов добраться до ступени 4 посчитает таблица?
Python
n = 4
dp = [0] * (n + 1)
dp[0] = 1
for i in range(1, n + 1):
    dp[i] = dp[i - 1]
    if i >= 2:
        dp[i] += dp[i - 2]
print(dp[n])
Вопрос 12 из 20
Почему инициализация нулями неверна для минимума монет?
Python
dp = [0] * (amount + 1)
for x in range(1, amount + 1):
    for coin in coins:
        if coin <= x:
            dp[x] = min(dp[x], dp[x - coin] + 1)
Вопрос 13 из 20
Как задать базу для числа способов получить сумму 0 без выбора элементов?
Вопрос 14 из 20
В каком порядке нужно заполнять таблицу?
Python
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + cost[i][j]
Вопрос 15 из 20
Что обычно означает значение ∞ в таблице минимизации?
Вопрос 16 из 20
Какой последний номинал будет выбран для суммы 6?
Python
coins = [1, 3, 4]
dp = [0, 1, 2, 1, 1, 2, 2]
parent = [-1] * 7
for x in range(1, 7):
    for coin in coins:
        if coin <= x and dp[x] == dp[x - coin] + 1:
            parent[x] = coin
            break
print(parent[6])
Вопрос 17 из 20
Как восстановить путь из клетки (i,j)?
Python
parent[i][j] = (pi, pj)
# parent хранит предшественника выбранного оптимального перехода
Вопрос 18 из 20
Почему одной таблицы оптимальных стоимостей иногда недостаточно для восстановления выбранных предметов?
Вопрос 19 из 20
Какие индексы образуют восстановленную LIS?
Python
a = [3, 1, 2, 5, 4]
parent = [-1, -1, 1, 2, 2]
end = 4
path = []
while end != -1:
    path.append(end)
    end = parent[end]
path.reverse()
print(path)
Вопрос 20 из 20
Как сжатие памяти с dp[i][j] до одной строки влияет на восстановление пути?
M:O(nm)\to O(m)

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу