最长上升子序列LIS
2018-03-20 14:29
323 查看
#include<vector> #include<iostream> using namespace std; vector<int>rebuild(vector<int>old,int key) { int begin = 0; int end = old.size() - 1; int mid = begin + (end - begin) / 2; if (key > old[end]) { old.push_back(key); }
else { while (begin != end) { if (old[mid] >= key) { end = mid; mid = begin + (end - begin) / 2; } else { begin = mid + 1; mid = begin + (end - begin) / 2; } } if (old[begin] >= key)old[begin] = key; } return old; } vector<int> LIS(vector<int>arr) { vector<int>newarr; if (arr.empty())return newarr; int length = arr.size(); newarr.push_back(arr[0]); for (int i = 1; i < length; i++) { newarr = rebuild(newarr,arr[i]); } return newarr; } int main() { vector<int>a = { 2,15,6,18,351,151,15,7 }; vector<int>b=LIS(a); int len = b.size(); cout << len; return 0; }偶然看到一个题目利用了这个LIS算法,仔细琢磨了一个多小时,自己写出了最小上升子序列的算法,利用二分查找替换元素,时间复杂度为O(nlogn),但是这个算法得到的只能是LIS的个数,如果要输出LIS,还是得用动态规划。
相关文章推荐
- 【转载】动态规划--最长上升子序列(LIS)
- 动态规划-最长上升子序列(LIS)
- 九度oj-1533 最长上升子序列 (LIS)
- 动态规划-最长上升子序列LIS
- 【转载】最长上升子序列(LIS)长度的O(nlogn)算法
- HDU 1025 Constructing Roads In JGShining's Kingdom (简单dp, 最长上升子序列LIS)
- hdu 5421 小明系列问题——小明序列(LIS最长上升子序列)
- 最长上升子序列LIS
- 算法练习--- DP 求解最长上升子序列(LIS)
- 最长上升子序列LIS
- LIS 最长上升子序列
- [动态规划]之裸lis之最长上升子序列POJ 2533
- LIS求解最长上升子序列问题
- poj1631 dp 最长上升子序列LIS
- POJ - 3903 Stock Exchange(LIS最长上升子序列问题)
- 最长上升子序列LIS
- LIS 最长严格上升子序列问题
- POJ 2533 Longest Ordered Subsequence(LIS:最长上升子序列)
- 动态规划DP_最长上升子序列LIS
- 【dp-LIS】牛客网 --最长上升子序列 POJ 2533--Longest Ordered Subsequence(LIS模板题)