Изменения

Перейти к: навигация, поиск

Задача о расстановке знаков в выражении

19 байт убрано, 17:45, 23 декабря 2013
Доказательство
Вычислим элементы таблицы <tex>d</tex>, тогда ответом на задачу будет значение <tex>d[1][n]</tex>.
== Доказательство ==
Рассмотрим ее, например, в такой формулировке. В арифметическом выражении, операндами которого являются целые числа, а операциями — бинарные арифметические операции “+” и “*”, расставить скобки так, чтобы результат оказался максимальным.Подзадачами, через которые мы будем выражать оптимальное решение, будут задачи об оптимальной расстановке скобок в произведениях наших операндов, начиная с i-го и заканчивая j-м. Запоминать результат оптимального решения соответствующей подзадачи мы будем в элементе ad[i, j] матрицы, размером n´nn*n, диагональные элементы которой (ad[i, i]) равны операндам, а для i > j все элементы равны 0. Пусть мы хотим подсчитать значение арифметического выражения для операндов, начиная с i-го и заканчивая j-м для i < j. Если мы предположим, что последней будет выполняться арифметическая операция, расположенная после операнда с номером k (i £ k < j) и эта операция — сложение, то результат подсчета будет равен сумме элементов ad[i, k] и ad[k+1, j] нашей матрицы. С умножением ситуация несколько более сложная. Так как операндами могут быть и отрицательные числа, то для нахождения максимума из произведений нужно знать не только максимальные, но и минимальные значения для арифметических операций над операндами с i-го по k-й и с k+1-го по j-й соответственно. Значит для любой последовательности операндов нужно хранить значение как максимально, так и минимально возможного результата выполнения арифметических операций над ними. Однако, дополнительная матрица для хранения минимальных значений не нужна. Так как для i > j матрица a d не заполнена, мы можем отвести эти элементы для хранения минимумов, только запоминать результат решения этой подзадачи для операндов, начиная с i-го и заканчивая j-м, мы будем в элементе ad[j, i]. Тогда в общем случае, если после k-го операнда стоит операция умножения (i £ k < j), то максимальный результат будет равен max(ad[i, k]´ a* d[k+1, j], ad[k, i]´ a* d[j, k+1], ad[i, k]´ a* d[j, k+1], ad[k, i]´ a* d[k+1, j]).
== Реализация ==
14
правок

Навигация