Задача о расстановке знаков в выражении — различия между версиями
| Строка 5: | Строка 5: | ||
Получаем следующие соотношения: <br /> | Получаем следующие соотношения: <br /> | ||
* <tex>d[i][i] = a_i </tex><br /> | * <tex>d[i][i] = a_i </tex><br /> | ||
| − | * <tex>d[i][j] = \ | + | * <tex>d[i][j] = \max\limits_{\mathop{k = i..j-1}}[\max(d[i][k]+d[k+1][j], d[i][k] \times d[k+1][j])] \ (i < j)</tex> <br /> |
Вычислим элементы таблицы <tex>d</tex>, тогда ответом на задачу будет значение <tex>d[1][n]</tex>. | Вычислим элементы таблицы <tex>d</tex>, тогда ответом на задачу будет значение <tex>d[1][n]</tex>. | ||
Версия 23:27, 3 декабря 2010
Задача о расстановке знаков в выражении — задача о нахождении максимального значения выражения, полученного расстановкой знаков и скобок в последовательности .
Решение
Данная задача решается с использованием принципа оптимальности на подотрезке. Введём матрицу размером , где будет равен максимальному значению, достигаемому на подотрезке .
Получаем следующие соотношения:
Вычислим элементы таблицы , тогда ответом на задачу будет значение .
Реализация
// d - матрица как в описании; a - последовательность из n элементов; i, j, k - счётчики
for i := 1 to n do
d[i][i] := a[i];
for i := n - 1 downto 1 do
for j := i + 1 to n do
for k := i to j - 1 do
d[i][j] := max(d[i][j], max(d[i][k] + d[k+1][j], d[i][k] * d[k+1][j]));
write(d[1][n]); // вывод ответа
Пример
Пусть дана последовательность 2, 1, 1, 2. Таблица для неё будет выглядеть так:
| j = 1 | j = 2 | j = 3 | j = 4 | |
| i = 1 | 2 | 3 | 4 | 9 |
| i = 2 | 0 | 1 | 2 | 4 |
| i = 3 | 0 | 0 | 1 | 3 |
| i = 4 | 0 | 0 | 0 | 2 |