使用最基础的方法计算最长递增子序列的时间复杂度为O(n^2),
在n值过大时,肯定会超时。因此,在这里介绍一种优化算法。
维护一个一维数组dp,dp[i]表示最长上升子序列长度是i的所有子串中末尾最小的那个数,根据这个数字,我们可以比较知道,只要当前考察的这个数比dp[i]大,那么当前这个数一定能通过dp[i]构成一个长度为i+1的上升子序列。当然我们希望在dp数组中找一个尽量靠后的数字,这样我们得到的上升子串的长度最长,查找的时候使用二分搜索,这样时间复杂度便下降了。
可能解释的不太好,那么还是把代码发出来吧
Talk is cheap,show me the code.
#include<iostream>
#include<stdio.h>
#include<queue>
#include<stack>
#include<algorithm>
#include<string.h>
#include<string>
#include<math.h>
int