3. Динамическое программирование на маске, NP-трудные задачи
Динамическое программирование (DP) по маскам (ДП по подмножествам) — метод решения сложных задач, в том числе NP-трудных, путём разбиения их на более простые подзадачи и повторного использования уже вычисленных результатов. Битовые маски (массивы значений bool) используются как параметры для ДП, так как позволяют обозначать подмножества объектов. Принцип Подход полезен, когда задача обладает двумя ключевыми свойствами: Оптимальная подструктура — оптимальное решение всей задачи может быть составлено из оптимальных решений её подзадач. Перекрывающиеся подзадачи — одни и те же подзадачи возникают многократно в процессе вычислений. Динамическое программирование позволяет избежать повторного решения одинаковых подзадач, что снижает вычислительную сложность с экспоненциальной до полиномиальной. Примеры Задача о коммивояжёре (англ. TSP — Travelling Salesman Problem). Существует N городов, между некоторыми из которых есть дороги. Требуется обойти все города, вернувшись в первый, так, чтобы длина пути была минимальной. ДП по подмножествам — оптимальное решение этой задачи. Задача о рюкзаке (также задача о ранце). Из заданного множества предметов со свойствами «стоимость» и «вес» требуется отобрать подмножество с максимальной полной стоимостью, соблюдая при этом ограничение на суммарный вес. ДП по маскам помогает найти решение для задачи с целочисленными ценностями предметов. Алгоритмы В ДП по маскам промежуточные результаты (например, длину кратчайшего пути) хранятся в структурах dp. Вместо пересчёта одних и тех же вариантов множество раз алгоритм использует сохранённые результаты. Например, в задаче о коммивояжёре формула перехода для ДП по маскам обозначает, что чтобы попасть в вершину i, нужно перейти в неё из какой-либо другой вершины j, также входящей в маску. Из всех таких вершин нужно выбрать такую, что общая длина пути в i будет наименьшей. Сложность Сложность алгоритмов для решения NP-трудных задач динамическим программированием по маскам зависит от формулировки задачи. Например, в задаче о рюкзаке алгоритмы динамического программирования сильно зависят от формулировки задачи. Например, если в условии появляется второе ограничение типа неравенства (двухмерный рюкзак), то задача уже не имеет известной схемы полиномиального времени.
Динамическое программирование (DP) по маскам (ДП по подмножествам) — метод решения сложных задач, в том числе NP-трудных, путём разбиения их на более простые подзадачи и повторного использования уже вычисленных результатов. Битовые маски (массивы значений bool) используются как параметры для ДП, так как позволяют обозначать подмножества объектов. Принцип Подход полезен, когда задача обладает двумя ключевыми свойствами: Оптимальная подструктура — оптимальное решение всей задачи может быть составлено из оптимальных решений её подзадач. Перекрывающиеся подзадачи — одни и те же подзадачи возникают многократно в процессе вычислений. Динамическое программирование позволяет избежать повторного решения одинаковых подзадач, что снижает вычислительную сложность с экспоненциальной до полиномиальной. Примеры Задача о коммивояжёре (англ. TSP — Travelling Salesman Problem). Существует N городов, между некоторыми из которых есть дороги. Требуется обойти все города, вернувшись в первый, так, чтобы длина пути была минимальной. ДП по подмножествам — оптимальное решение этой задачи. Задача о рюкзаке (также задача о ранце). Из заданного множества предметов со свойствами «стоимость» и «вес» требуется отобрать подмножество с максимальной полной стоимостью, соблюдая при этом ограничение на суммарный вес. ДП по маскам помогает найти решение для задачи с целочисленными ценностями предметов. Алгоритмы В ДП по маскам промежуточные результаты (например, длину кратчайшего пути) хранятся в структурах dp. Вместо пересчёта одних и тех же вариантов множество раз алгоритм использует сохранённые результаты. Например, в задаче о коммивояжёре формула перехода для ДП по маскам обозначает, что чтобы попасть в вершину i, нужно перейти в неё из какой-либо другой вершины j, также входящей в маску. Из всех таких вершин нужно выбрать такую, что общая длина пути в i будет наименьшей. Сложность Сложность алгоритмов для решения NP-трудных задач динамическим программированием по маскам зависит от формулировки задачи. Например, в задаче о рюкзаке алгоритмы динамического программирования сильно зависят от формулировки задачи. Например, если в условии появляется второе ограничение типа неравенства (двухмерный рюкзак), то задача уже не имеет известной схемы полиномиального времени.
