【发布时间】:2017-05-22 19:39:59
【问题描述】:
这是一道标准的动态规划题LIS PROBLEM
我想要二维坐标中点的最长递增子序列
也就是说,数组中索引 i 处的 2 个点 A(x1,y1),数组中索引 j 处的 B(x2,y2) 可以是递增序列的一部分,如果 (x1i)
我的代码如下,使用标准 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) ?
在这里找到一些东西供参考:
Longest Increasing Subsequence (LIS) with two numbers
第二个答案更适合我的情况,但我们如何实施呢?
需要更好的答案或算法。
【问题讨论】:
-
您引用的维基百科文章显示了
O(n log n)算法。它不适合你吗? -
不是一维@IgorTandetnik
-
据我了解,您确实有一个一维数组,其中包含可以相互比较的元素。每个对象内部由一对数字组成的事实是无关紧要的。算法中没有任何内容要求对象是整数或其他标量类型 - 只是它们具有可比性。
-
如果您考虑充分,您就会明白决定在 LIS 中选择哪个元素是困难的,就好像我不选择一个元素一样,在某些情况下它可能是 LIS 的一部分,但我知道那里是一个复杂度低于 O(N^2) 的解决方案。
-
如果你有 2 个变量,它已经是二维的,因为它们是坐标。检查 THis Link 但选择的答案是错误的,第二个位置是正确的,但我需要在 C++ 中实现以我的条件。最近发现。
标签: c++ algorithm c++11 dynamic-programming lis