Предположим, у меня есть случайная последовательность (упорядоченный массив), которая содержит n положительное число с плавающей запятой. Как найти подпоследовательность размера k так, чтобы минимальное расстояние между всеми парами поплавков в подпоследовательности было максимальным, я имею в виду, что они находятся на самом дальнем расстоянии.
Примечание. Подпоследовательность последовательности – это упорядоченное подмножество элементов последовательности, имеющих тот же порядок следования, что и исходная последовательность.
ОГРАНИЧЕНИЯ
- 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) выберите a[0] , теперь найдите ceil(a[0]+ x) = Y в массиве .... а затем ceil(Y+ x) и так далее k-1 раз, также kth элемент будет a[n -1]
Чтобы найти х:
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
Я хочу исправить решение динамического программирования, хотя я знаю, что x можно найти с помощью двоичного поиска по x , но при сортировке я теряю порядок последовательности и отнимаю много времени (O (n^2)). Как решить эту проблему?