Шаг 6.
Динамическое программирование.
Примеры задач, решаемые методом динамического программирования

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

  1.     Дана последовательность из n матриц заданных размеров [A1, A2, ..., An] (матрица Ai имеет размер pi-1 на pi ); требуется найти такую (полную) расстановку скобок в произведении A1A2 ... An, чтобы вычисление произведения требовало наименьшего числа умножений и найти результат перемножения этих матриц. [1, с.289].
    Комментарии вы можете посмотреть на 7 шаге.
    Решение вы можете посмотреть здесь.

  2.     В головоломку умножения играют с рядом карт, каждая из которых содержит одно положительное целое число. Во время хода игрок убирает одну карту из ряда и получает число очков, равное произведению числа на убранной карте и чисел на картах, лежащих непосредственно слева и справа от неё. Не разрешено убирать первую и последнюю карты ряда. После последнего хода в ряду остаётся только две карты.
        Цель игры - убрать карты в таком порядке, чтобы минимизировать общее количество набранных очков.
        Ограничения: 3 ≤ N ≤ 50, числа на картах целые от 1 до 50, время 1с. [2].
    Комментарии вы можете посмотреть на 8 шаге.
    Решение вы можете посмотреть здесь.

  3.     Найдите общую подпоследовательность наибольшей длины для двух данных последовательностей. [1, с.300].
    Комментарии вы можете посмотреть на 9 шаге.
    Решение вы можете посмотреть здесь.

  4.     В таблице размером N*N, где N<13, клетки заполнены случайным образом цифрами от 0 до 9. Предложить Чебурашке алгоритм, позволяющий найти маршрут из клетки (1, 1) в клетку (N, N) и удовлетворяющий следующим условиям:
    • любые две последовательные клетки в маршруте имеют общую сторону;
    • количество клеток маршрута минимально;
    • сумма цифр в клетках маршрута максимальна. [3].

    Комментарии вы можете посмотреть на 10 шаге.
    Решение вы можете посмотреть здесь.

  5.     Дана матрица N*N, заполненная положительными числами. Путь по матрице начинается в левом верхнем углу. За один ход можно пройти в соседнюю по вертикали или горизонтали клетку (если она существует). Нельзя ходить по диагонали, нельзя оставаться на месте. Требуется найти максимальную сумму чисел, стоящих в клетках по пути длиной K (клетку можно посещать несколько раз).
        Ограничения: 2 ≤ N ≤ 15, элементы матрицы имеют значения от 1 до 999, 1 ≤ K ≤ 20, все числа целые, время 5с.
        Ввод из файла route2.in. В первой строке находятся разделенные пробелом числа N и K. Затем идут N строк по N чисел в каждой.
        Вывод в файл route2.out. Вывести одно число - максимальную сумму. [2].
    Комментарии вы можете посмотреть на 11 шаге.
    Решение вы можете посмотреть здесь.

  6.     Задан вес E пустой копилки и вес F копилки с монетами. В копилке могут находиться монеты N видов, для каждого вида известна ценность Pi и вес Wi одной монеты. Найти минимальную и максимальную суммы денег, которые могут находиться в копилке.
        Ограничения: 1 ≤ E ≤ F ≤ 100, 1 ≤ N ≤ 50, 1 ≤ Pi ≤ 500, 1 ≤ Wi ≤ 100, все числа целые, время 2с. [2].
    Комментарии вы можете посмотреть на 12 шаге.
    Решение вы можете посмотреть здесь.

(1)Кормен Т., Лейзерсон Ч., Ривест Р. Алгоритмы: построение и анализ. — М.: МЦНМО, 2000.-960с.,263 ил.
(2)Меньшиков Ф.В. Олимпиадные задачи по программированию. - СПб: Питер, 2006. - 315с.
(3)Статья "Динамическое программирование и жадные алгоритмы"
(http://kitnet.altnet.ru/www/metod/book3/doc1/str1.htm)


    На следующем шаге мы разберем решение задачи "Перемножение нескольких матриц".


Предыдущий шаг Содержание Следующий шаг