nlog(n)解动态规划--最长上升子序列(Longest increasing subsequence)

时间:2023-07-25 20:07:07

最长上升子序列LIS问题属于动态规划的初级问题,用纯动态规划的方法来求解的时间复杂度是O(n^2)。但是如果加上二叉搜索的方法,那么时间复杂度可以降到nlog(n)。

  具体分析参考:http://blog.chinaunix.net/uid-26548237-id-3757779.html

  代码:

#include <iostream>

using namespace std;

int LIS_nlogn(int *arr, int len)
{
int *LIS = new int[len]; //LIS[i]存储的是每个最长长度i的最小结尾,即在arr里的最小结尾
for (int i = ; i < len; i++)
{
LIS[i] = -;
} int maxLen = ; //记录最长上升子串的最大长度
LIS[] = arr[]; for (int i = ; i < len; ++i)
{
int low = , high = maxLen, mid;
while (low <= high)
{
mid = (low + high)/;
if (LIS[mid] < arr[i])
{
low = mid + ;
}
else
{
high = mid - ;
}
}
LIS[low] = arr[i]; //插入元素到相应的位置
if (low > maxLen)
{
maxLen++;
}
} delete LIS; return maxLen;
} int main()
{ int arr[] = {,,,,,,,,};
int len = ;
int ret; ret = LIS_nlogn(arr, len); cout<<ret<<endl; return ;
}