使用二分查找求解最长上升子序列
来源:互联网 发布:协同过滤算法 spark 编辑:程序博客网 时间:2024/06/06 04:34
题目链接:HLOJ 9948 气球排序(3秒版),由于时间延长到3秒,一般的LOS也能过,但使用本方法时间大大节省(2500ms vs. 187ms)。
#include<iostream>#include<vector>#include<cstdio> //ZOJ 用scanf,printf时必须包含此头文件using namespace std;const int N=20000;int v[N];//存放输入的数值int a[N];//辅助数组,存放左边小于中间数的数,右边大于中间数的数int f[N];//辅助数组,存放LOS长度//状态:f[i],以第i个元素(v[i])为最后一个元素的最长上升子序列的长度//方程:f[i]=max(f[j]+1, f[i]), 0<=j<i && v[i]>v[j]//初值:f[i]=1,0<=i<n,考虑只有v[i]一个数时的上升序列的长度//结果:f[]中的最大值int BSearch(vector <int> a, int t) //二分查找{int n=a.size(), low=0, high=n-1;while (low<=high){int mid=(low + high)/2;if (t==a[mid]) return mid;else if (t>a[mid]) low=mid+1;else high=mid-1;}return low;}int LosBS(int a[], int n) //使用二分查找的最长上升子序列{vector <int> tv; //存放构成最长上升子序列的数据tv.push_back(a[0]);for (int i=1; i<n; i++){int k=tv.size()-1;if (a[i]>tv[k]) //当前考虑的数(a[i])大于当前最长上升子序列(tv)的最后一个数则直接放到最后{tv.push_back(a[i]);}else //在当前最长上升子序列中使用二分查找求得存放当前考虑的数的位置并放入该数{int j=BSearch(tv, a[i]);tv[j]=a[i];}}return tv.size();}void run(){ int i, n, k=0; scanf("%d", &n); fill(f, f+n, 0);for(i=0;i<n;i++) scanf("%d", &v[i]);int m=(n-1)/2;for (i=0;i<m;i++) {if (v[i]<v[m])a[k++]=v[i];}a[k++]=v[m];int l1=LosBS(a,k);k=0;for (i=m+1;i<n;i++) {if (v[i]>v[m])a[k++]=v[i];}int l2=LosBS(a,k);if (k==0) l2=0; printf("%d\n", n-l1-l2);}int main(){#ifndef ONLINE_JUDGE freopen("e:\\1.txt", "r", stdin);#endifint T;scanf("%d", &T);for(int i=1; i<=T; i++) run();return 0;}
0 0
- 使用二分查找求解最长上升子序列
- hdu 1025 二分查找+最长上升子序列
- 【模版】二分查找、最长上升子序列(LIS)、最长下降子序列模版
- LIS求解最长上升子序列问题
- UVa 10534 - Wavio Sequence DP+最长上升子序列(严格上升)+二分查找(nlogn)
- 最长上升子序列 二分优化
- 最长上升子序列 (二分 nlogn)
- Hduoj1025【最长上升子序列 + 二分】
- 最长上升子序列 (二分)
- 二分求最长上升子序列
- 最长上升子序列,LIS<DP+二分>
- Constructing Roads In JGShining's Kingdom 最长上升子序列+二分查找
- POJ2533, 最长上升子序列(贪心+二分查找时间复杂度O(nlogn))
- 九度OJ 1533 最长上升子序列 (基于贪心和二分查找)
- hdu 1025 最长子序列,lower_bound的使用,二分查找
- HDU 1025 DP+二分求解最长上升序列
- hdu 5256 序列变换(最长上升子序列&&二分)
- O(nlgn)求解最长上升子序列长度
- library not found for -lAPOpenSdk解决方案
- [真格邦]JAVA实战-三人斗地主
- 一句话解释java类型的强转
- Android 快速开发框架:推荐10个框架:afinal、ThinkAndroid、andBase、KJFrameForAndroid、SmartAndroid、dhroid..
- Android SwipeRefreshLayout 官方下拉刷新控件介绍
- 使用二分查找求解最长上升子序列
- js隐藏与显示回到顶部按钮及window.onscroll事件应用
- Android 热门搜索,自定义流式布局,自动换行,自动补齐
- 梯度消失,梯度爆炸
- Android实用技巧.视图技巧(一)
- Ubuntu--Jenkins中配置GIT仓库 以及出现配置git时not connection 解决办法 ---
- eval(expression, globals=None, locals=None)动态语言的特性(很棒)
- SVN 一次性提交多个目录中文件的方法
- dubbo 延迟暴露