の値を座標に質問LIS PROBLEMLISこれは標準的な動的プログラミングであるO(NlogN)またはO(Nlog^2N)
Iは、2次元の点のための最長増加サブシーケンスである
、2座標たいです配列内のインデックスiに(X1、Y1)を指し、配列内のインデックスjでB(X2、Y2)が増加するシーケンスの一部とすることができる場合 (X1 < = X2)& &(Y1 < = Y2)& &! (x1 == x2 & &y1 == y2)& &(J> I)
自分のコードそれ以下O(N^2)標準的なDPを使用しているようである: - これはO(N^2)溶液で
#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(NlogN)やO(Nlog^2N)で解くための任意の言い回し?参照用
はここで何かを見つけた:
Longest Increasing Subsequence (LIS) with two numbers
二答えは私の場合のために、より適切であるが、どのように我々はそれを実装することができますか?
より良い回答またはアルゴリズムが必要です。
あなたが引用しているウィキペディアの記事は、 'O(n log n)'アルゴリズムを示しています。あなたのために働かないのですか? –
これは1次元ではありません@IgorTandetnik –
私が理解しているように、あなたは互いに比較できる要素を含む1次元配列を持っています。各オブジェクトが内部的に数字のペアで構成されているという事実は無関係です。アルゴリズムの中には、オブジェクトが整数か他のスカラ型であることが必要ではありません。 –