Как вы правильно определили (пометили), это действительно очень похоже на задачу умножения матриц (в каком порядке я умножаю матрицы, чтобы сделать это быстро).
Это может быть решено полиномиально с использованием динамического алгоритма.
Вместо этого я собираюсь решить аналогичную, более классическую (и идентичную) задачу, учитывая формулу с числами, сложением и умножением, какой способ заключения в скобки дает максимальное значение, например, 6+1 * 2
становится (6+1)*2
, что больше, чем 6+(1*2)
.
Обозначим наши входные a1 to an
действительные числа и o(1),...o(n-1) либо *
, либо +
. Наш подход будет работать следующим образом: мы рассмотрим подзадачу F(i,j), которая представляет максимальную формулу (после скобок) для a1,...aj. Мы создадим таблицу таких подзадач и увидим, что F(1,n) — это именно тот результат, который мы искали.
Определять
F(i,j)
- If i>j return 0 //no sub-formula of negative length
- If i=j return ai // the maximal formula for one number is the number
- If i<j return the maximal value for all m between i (including) and j (not included) of:
F(i,m) (o(m)) F(m+1,j) //check all places for possible parenthasis insertion
Это перебирает все возможные варианты. Доказательство правильности выполняется индукцией по размеру n=j-i и довольно тривиально.
Давайте проведем анализ во время выполнения:
Если мы не сохраняем значения динамически для небольших подзадач, это работает довольно медленно, однако мы можем заставить этот алгоритм работать относительно быстро в O(n^3)
Мы создаем таблицу * n T, в которой ячейка с индексом i, j содержит F (i, j), заполняя F (i, i) и F (i, j) для j, меньшего, чем i, выполняется в O (1) для каждую ячейку, так как мы можем вычислить эти значения напрямую, затем идем по диагонали и заполняем F(i+1,i+1) (что мы можем сделать быстро, так как мы уже знаем все предыдущие значения в рекурсивной формуле), мы повторяем это n раз для n диагоналей (на самом деле все диагонали в таблице), и заполнение каждой ячейки занимает (O (n)), поскольку каждая ячейка имеет O (n) ячеек, мы заполняем каждую диагональ за O (n ^ 2), что означает, что мы заполняем все таблица в O (n ^ 3). После заполнения таблицы мы, очевидно, знаем F (1, n), что является решением вашей проблемы.
Теперь вернемся к вашей проблеме
Если вы переведете многоугольник в n
разных формул (по одной для начала в каждой вершине) и запустите на нем алгоритм для значений формулы, вы получите именно то значение, которое хотите.
person
Benjamin Gruenbaum
schedule
19.01.2013