Ответ 1
Чтобы понять, как вы используете самый длинный алгоритм подпоследовательности для решения этой проблемы, давайте начнем с некоторой интуиции, а затем создадим решение. Поскольку вы можете создавать мосты между городами по совпадающим индексам, вы можете думать о множестве мостов, которые вы создаете как самый большой набор пар, которые вы можете найти, которые не содержат никакого перехода. Итак, при каких обстоятельствах у вас будет переход?
Посмотрим, когда это произойдет. Предположим, что мы сортируем все мосты, построенные их первым городом. Если пересекаются два моста, то мы должны иметь, что существует некоторый мост (a i, b i), такой, что для некоторого другого моста (a j, b j) выполняется одно из следующих условий:
- a i < a j и b i > b j
- a i > a j и b i < б <югу > Jсуб >
В этом первом случае говорится, что есть мост, чей верхний город находится дальше справа от начала нашего моста, а нижний город находится дальше слева, чем конец нашего моста, а второй случай обращается к противоположному случаю.
Учитывая, что это свойство необходимо удержать, нам нужно убедиться, что для каждого набора мостов мы имеем, что для любой пары мостов выполняется одно из двух следующих свойств (a i, b i), (a j, b j): либо
- a i & le; a j и b i & le; б <югу > Jсуб >
или
- a i & ge; a j и b i & ge; б <югу > Jсуб >
Свойство, которое мы только что определили, определяет частичное упорядочение & le; как на множестве мостов, где мы говорим, что (a i, b i) & le; и (a j, b j), если a i & le; a j и b i & le; б <югу > Jсуб > . Обратите внимание, что это не полный порядок - например, (1, 2) несравнимо с (2, 1) - но это частичный порядок, поскольку он рефлексивный, антисимметричный и транзитивный.
Учитывая это, цель проблемы состоит в том, чтобы найти самый большой набор элементов, которые мы можем, которые могут быть полностью упорядочены по этой связи, поскольку, если у нас есть набор, содержащий два несравнимых элемента, эти элементы обязательно должны представлять собой пересекающиеся мосты. Другими словами, мы хотим найти самую длинную цепочку в частичном порядке. Один из способов сделать это - время O (n 2), сравнить каждый элемент с другим элементом и посмотреть, какие элементы можно упорядочить по & le; как. Это создает ориентированный ациклический граф, где пара (a i, b i) имеет ребро к (a j, b j) iff (a i, b i) & le; как (a j, b <суб > Jсуб > ). Как только мы получим этот ациклический граф, мы сможем найти самый длинный путь в графике, чтобы найти самый большой набор элементов, которые сопоставляются по & le; и, что затем дает решение проблемы. Таким образом, общая продолжительность работы O (n 2).
Однако мы можем сделать значительно лучше этого. Проблема с вышеприведенным алгоритмом заключается в том, что мы не можем легко определить, как элементы сравниваются друг с другом, поэтому мы должны явно сравнивать каждый город друг с другом.
2 5 8 10
6 4 1 2
Отсоедините города в нижней строке:
8 10 5 2
1 2 4 6
Теперь, здесь действительно классное наблюдение. Если у нас есть элементы, отсортированные по их нижней строке, то мы можем сказать, могут ли две пары упорядочиваться через & le; какпросматривая их позиции в верхнем ряду. Если первая пара находится слева от второй пары, мы сразу же знаем, что второй элемент первой пары меньше второго элемента второй пары, так как мы отсортировали их по второй координате. Затем мы получаем, что пару элементов можно построить вместе, если первый элемент первой пары меньше первого элемента второй пары. Следовательно, если мы хотим найти набор мостов, которые можно построить вместе, мы будем искать возрастающую подпоследовательность верхней строки, так как в этом случае как первый, так и второй элементы пар увеличиваются по мере того, как мы переходим от слева направо. Нахождение самой длинной возрастающей подпоследовательности затем решает эту проблему. Поскольку мы можем сортировать пары по их второму полю в O (n log n) и находить самую длинную возрастающую подпоследовательность в O (n log n), это решение O (n log n) для задачи!
Уф! Надеюсь, что этот ответ подробно объяснит подробности!