Предположим, у меня есть последовательность random ( массив упорядочения ), которая содержит n положительное число с плавающей запятой. Как найти подпоследовательность размера k , чтобы минимальное расстояние между всеми парами чисел с плавающей запятой в подпоследовательности было максимальным, то есть они находятся на самом дальнем расстоянии.
Примечание : A подпоследовательность последовательности - это упорядоченное подмножество элементов последовательности, имеющих тот же порядок следования, что и исходная последовательность.
ОГРАНИЧЕНИЯ
- n> 10 ^ 5
- n> k> 2
пример :
последовательность a [] = {1.1,2.34,6.71,7.01,10.71} и k = 3, подпоследовательность = {1.1,6.71,10.71}, минимальное расстояние 4 между 10,71 и 6,71.
Неверная подпоследовательность :
{1.1,7.01,10.71}, минимальное расстояние составляет 3,7
{1.1,2.34,6.71}, минимальное расстояние составляет 1,24
Я придумал решение:
1) массив сортировки
2) выберите [0], теперь найдите ceil (a [0] + x) = Y в массиве ... ., а затем ceil (Y + x) и так k-1 раз, также k-й элемент будет быть [n-1]
Чтобы найти x:
dp [i, j] быть x для выбора j элементов из первых i элементов.
Наконец, мы хотим dp [n] [k], который равен x
Но я столкнулся с проблемой поиска x и изменения порядка индексов.
dp [i, j] = max (min (dp [k, j-1], dp [i] -A [k]))
от k = 1 до i-1, от i = 2 до n, j = 2 до i
dp [ i] [1] = 0 по i = от 1 до n
Я хочу исправить решение программирования Dynami c, хотя я знаю, что x можно найти с помощью двоичного поиска по x, но путем сортировки я теряю упорядочение последовательности и требует много времени ( O ( n ^ 2 )). Как мне решить эту проблему?