В дальнейшем я собираюсь предположить, что k >= 2
, так как проблема тривиальна, чтобы решить иначе.
Вот частичное решение, в том смысле, что оно может решить некоторые проблемы за O(n)
время, если форма стержней имеет некоторые специфические свойства.
В частности, мы можем вывести следующее:
Если объем, охватываемый всеми столбцами, является выпуклым, то оптимальное решение содержит только столбцы в начале и конце.
Доказательство:
Предположим, что в решении есть любое разбиение, тогда мы можем переместить группу, которая находится от одного из ребер, к одному из ребер. Это делается путем отмены выбора бара на одной стороне и выбора нового на другой стороне. Поскольку форма выпуклая, кривизна должна быть неположительной, тогда, когда мы движемся в нерастущем направлении, уменьшение при дальнейшем движении в этом направлении должно быть как минимум таким же большим (кривизна гарантирует это). Поэтому мы можем переместить расщепление в решении к одному из ребер без увеличения (и, вероятно, уменьшения) покрытой области.
Мы можем проверить за O(n)
время, является ли форма выпуклой (не увеличивающаяся разница между столбцами), и мы можем решить эту проблему с помощью оптимизации скользящего окна, что легко сделать в O(n)
. Поэтому мы можем предварительно обработать любое другое решение этим, чтобы свести набор задач к задаче, содержащей хотя бы одну вогнутую область. Если мы можем найти подзадачи для других алгоритмов, которые также содержат это свойство, то мы также можем решить их отдельно в этом смысле.
Для вогнутых областей они могут иметь стабильную внутреннюю область (где могут быть привлечены новые расщепления), в дополнение к внешним возможным стабильным областям (где другие расщепления могут все еще притягиваться, потому что даже если разница в площади на таких ход положительный, ход еще может быть отрицательным). Используя это, мы можем описать полностью вогнутую область с помощью подразделов, где расщепления будут двигаться к краям или к устойчивой средней точке.
Обратите внимание, что многое из вышеперечисленного падает, когда вогнутые и выпуклые области соединены, поскольку критерии устойчивости зависят от наличия границы в начале и конце, от которой мы измеряем. Хотя можно было бы полностью решить эту проблему, опираясь на этот подход, я не уверен, насколько это поможет на произвольно сложных фигурах.
Требование к вогнутой области иметь внутреннюю устойчивую область, как правило, довольно жесткое (в глобальном масштабе), и я не уверен, что вы можете получить очень много из них в глобальном масштабе, так что вот алгоритм, который использует это для решения проблемы в O(n)
, O(kn)
или O(kn^2)
, в зависимости от сложности проблемы, путем анализа различных эвристик и перехода к более дорогой, если мы не уверены мы нашли оптимальное решение.
Сначала мы вычисляем базовый результат в виде скользящего окна (O(n)
) и сохраняем этот результат. Затем мы ищем области устойчивости для одной точки (эти внешние области уже рассматриваются в скользящем окне), которая указывает в сторону от краев и имеет площадь, меньшую, чем найденное решение. Если таких точек больше 1 (требуется специальная форма), тогда по умолчанию возвращается базовый алгоритм, такой как у Маниша Чандры Джоши. Если найдена одна такая точка, мы переходим к решению O(nk)
, если его нет, текущее решение принимается. Обратите внимание, что мы могли бы расширить приведенную ниже версию более чем на 1 из таких точек глобальной стабильности, но на практике это потребовало бы, чтобы они были достаточно близки, поскольку в дальнейшем они будут иметь тенденцию к сбоям.
В решении 'O (kn)' мы решаем скользящее окно отдельно по обе стороны от глобальной точки стабильности в середине, для каждого из k
возможных значений назначений стержней с любой стороны, ивыберите лучшее из этих решений.Затем мы снова ищем области стабильности внутри каждой из областей (помните, это означает, что расщепление не будет двигаться к краю), и проверяем, является ли область оптимальной из этих точек вместе с центральной точкой, которую мы вычисляем.for имеет меньшую площадь, чем нижняя часть решений 'O (kn)' и 'O (n)'.Если такая точка найдена, мы должны решить ее до полного решения (например, Маниша Чандры Джоши), в противном случае мы можем принять лучшее из двух решений, которые мы рассчитали.
Обратите внимание, что это должно быть возможно, включать большееграничная область как безопасная или легко выводимая из безопасного решения в приведенном выше алгоритме, и, таким образом, увеличивает количество случаев, когда мы не возвращаемся к более медленному алгоритму.В частности, область, расположенная примерно на расстоянии «k» от края, может иметь простые решения или на практике уже охватываться более ранними решениями.Обратите внимание, что, вычисляя скользящие окна как окна непокрытой области, мы должны быть в состоянии сгенерировать несколько простых решений для таких случаев в сочетании с данными из решений динамического программирования в случае 'O (kn) `.