Задача о расстановке знаков в выражении — различия между версиями
Ruslan02 (обсуждение | вклад) (→Реализация) |
Ruslan02 (обсуждение | вклад) (→Источники) |
||
Строка 65: | Строка 65: | ||
== Источники == | == Источники == | ||
− | * Кормен, | + | *[http://fvn2009.narod.ru/Olympiads/Rules_Olympiads/Rules22.htm Олимпиадные задачи и решения {{---}} Классические задачи динамического программирования] |
− | + | ||
− | + | == Список литературы == | |
+ | * Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4 | ||
[[Категория:Дискретная математика и алгоритмы]] | [[Категория:Дискретная математика и алгоритмы]] | ||
[[Категория:Динамическое программирование]] | [[Категория:Динамическое программирование]] |
Версия 21:00, 4 июня 2017
Задача: |
Пусть задана последовательность неотрицательных чисел | . Требуется расставить знаки и скобки в последовательности, чтобы значение полученного арифметического выражения было максимальным.
Решение
Данная задача решается с использованием принципа оптимальности на подотрезках. Введём матрицу размером , где будет равен максимальному значению, достигаемому на подотрезке .
Получаем следующие соотношения:
Вычислим элементы таблицы
, тогда ответом на задачу будет значение .Доказательство
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции
и , расставить скобки так, чтобы результат оказался максимальным. Подзадачами, через которые мы будем выражать оптимальное решение, будут задачи об оптимальной расстановке скобок в произведениях наших операндов, начиная с -го и заканчивая -м. Запоминать результат оптимального решения соответствующей подзадачи мы будем в элементе матрицы, размером , диагональные элементы которой равны операндам, а для все элементы равны . Пусть мы хотим подсчитать значение арифметического выражения для операндов, начиная с -го и заканчивая -м для . Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером и эта операция — сложение, то результат подсчета будет равен сумме элементов и нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с -го по -й и с -го по -й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для матрица не заполнена, мы можем отвести эти элементы для хранения минимумов, только запоминать результат решения этой подзадачи для операндов, начиная с -го и заканчивая -м, мы будем в элементе . Тогда в общем случае, если после k-го операнда стоит операция умножения, то максимальный результат будет равен ;Реализация
// d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики for i = 1 to n: d[i][i] = a[i]; for i = n - 1 downto 1: for j = i + 1 to n: for k = i to j - 1: d[i][j] = max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k + 1][j])); print(d[1][n]); // вывод ответа
Пример
Пусть дана последовательность
. Таблица для неё будет выглядеть так:Источники
Список литературы
- Томас Х. Кормен, Чарльз И. Лейзерсон, Рональд Л. Ривест, Клиффорд Штайн Алгоритмы: построение и анализ — 2-е изд. — М.: «Вильямс», 2007. — с. 459. — ISBN 5-8489-0857-4