LIS的另一种简单做法nlogn(带路径)

最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。

严格单调递增

第一种做法是离散化+树状数组/线段树,这种方法学了树状数组的人都能想得到。

第二种是二分+dp。小了个常数,时间和空间要稍稍比前面的快那么一些。

定义dp[i]=j,表示长度为i的上升自序列最小末端元素是j。

下面给出代码,不详细解释。


#include
#include
#include
#include
using namespace std;
const int maxn=1e5+7;
int p[maxn];
int n;
int dp[maxn];
int who[maxn];
int pre[maxn];
vectorpath;
int main()
{
    scanf("%d",&n);
    for(int i=0;i=0;i--)
                printf("%d ",path[i]);

    return 0;
}


你可能感兴趣的:(tricks,lis)