これは標準的な動的プログラミングの質問LIS PROBLEMです
2D 座標のポイントの最長増加サブシーケンスが必要です
つまり、配列 のインデックス i にある 2 つの点 A(x1,y1) 、配列のインデックス j にある B(x2,y2) は、(x1<=x2) && (y1 <=y2) && の場合、増加シーケンスの一部になることができます。 !(x1==x2 && y1==y2) && (j>i)
私のコードは以下のとおりです。これは、標準の 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(N^2) 解ですが、これをさらに縮小するか、O(NlogN) または O(Nlog^2N) で解くための任意のアルゴリズムを使用できますか?
参考までに、ここに何かを見つけました:
私の場合は 2 番目の回答の方が適していますが、それをどのように実装できますか?
より良い答えまたはアルゴリズムが必要です。