Это стандартный Динамическое программирование Вопрос LIS PROBLEMLIS для значений координат в O (NlogN) или O (Nlog^2N)
Я хочу самую длинную возрастающую подпоследовательность для точек в 2D координаты
, то есть 2 Точки A (x1, y1) с индексом I в массиве, в (х2, у2) с индексом J в массиве может быть частью возрастающей последовательности, если (x1 < = х2) & & (у1 < = у2) & &! (x1 == x2 & & y1 == y2) & & (J> я)
мой код, как показано ниже, который является O (N^2) с использованием стандартного DP: -
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
struct Pair
{
int x;
int y;
};
int main()
{
int n;
cin>>n;
vector<Pair> arr;
int L[1000000];
Pair a;
int i;int Maxchain=0;
for(i=0;i<n;i++)
{
cin>>a.x>>a.y;
arr.push_back(a);
L[i]=0;
for (int j = i-1; j >=0; j--)
{
if ((L[j]>(Maxchain-1))&&(L[j]>=L[i])&&(arr[j].x <= arr[i].x) && (arr[j].y <= arr[i].y) && !(arr[j].x == arr[i].x && arr[j].y == arr[i].y))
L[i] = L[j]+1;
}
Maxchain = L[i]>Maxchain ?L[i]:Maxchain ;
}
cout<<Maxchain;
return 0;
}
Это O (N^2) решение она может быть дополнительно уменьшено или любой алгоритм для решения этого вопроса в O (NlogN) или O (Nlog^2N)?
для справки нашли что-то здесь:
Longest Increasing Subsequence (LIS) with two numbers
Второй ответ более подходит для моего случая, но как мы можем реализовать это?
Нужен лучший ответ или алгоритм.
В самой статье Википедии вы цитируете алгоритм «O (n log n)». Разве это не работает для вас? –
nope его для одного измерения @IgorTandetnik –
Как я понимаю, у вас есть одномерный массив, который содержит элементы, которые можно сравнить друг с другом. Тот факт, что каждый объект внутри состоит из пары чисел, не имеет значения. Ничто в алгоритме не требует, чтобы объекты были целыми или каким-либо другим скалярным типом - просто они были сопоставимы. –