淦!最长上升\下降\不上升\不下降序列
2017-03-17 11:49
288 查看
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; const int A=700010; int n,num[A],f[A]; void init() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&num[i]); } int lis1(int i,int len)//下降 { int l=0,r=len,m; while(l+1<r) { m=(l+r)>>1; if(f[m]>num[i]) l=m; else r=m; } return r; } int lis2(int i,int len) //二分求上界(不上升) { int l=1,r=len; while(l<=r) { int m=l+(r-l)/2; if(f[m]>=num[i]) l=m+1; else r=m-1; } return l; } int work1()//最长上升子序列 { memset(f,0,sizeof(f)); f[1]=num[1]; long long len=1; for(int i=2;i<=n;i++) { if(num[i]>f[len]) f[++len]=num[i]; else { int j=lower_bound(f+1,f+len+1,num[i])-f; f[j]=num[i]; } } printf("%d\n",len); } int work2()//最长下降子序列 { memset(f,0,sizeof(f)); f[1]=num[1]; long long len=1; for(int i=2;i<=n;i++) { if(num[i]<f[len]) f[++len]=num[i]; else { int j=lis1(i,len); f[j]=num[i]; } } printf("%d\n",len); } int work3()//最长不上升子序列 { memset(f,0,sizeof(f)); f[1]=num[1]; long long len=1; for(int i=2;i<=n;i++) { if(num[i]<=f[len]) f[++len]=num[i]; else { int j=lis2(i,len); f[j]=num[i]; } } printf("%d\n",len); } int work4()//最长不下降子序列 { memset(f,0,sizeof(f)); f[1]=num[1]; long long len=1; for(int i=2;i<=n;i++) { if (num[i]>=f[len]) f[++len]=num[i]; else { int j=upper_bound(f+1,f+len+1,num[i])-f; f[j]=num[i]; } } printf("%d\n",len); } int main() { init(); work1(); work2(); work3(); work4(); return 0; }
相关文章推荐
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法实现及其优化
- LIS(Longest Increasing Subsequence)最长上升(不下降)子序列
- BZOJ1046(HAOI2007)[上升序列]--最长下降子序列预处理
- 最长不上升(下降)子序列——拦截导弹
- hdu 4604 Deque(最长上升与下降子序列-能够重复)
- 动态规划 最长上升(下降)子序列 SDNUOJ 1040 导弹拦截和最少拦截系统
- poj 1836 Alignment( 最长上升(下降)子序列 )
- LIS(Longest Increasing Subsequence)最长上升(不下降)子序列
- POJ 1836 Alignment(DP max(最长上升子序列 + 最长下降子序列))
- 最长上升子序列(LIS)和最长下降子序列(LDS)
- 最长上升或下降子序列解法 总结
- 如何用O(nlogn)的的速度求解最长上升(下降)子序列
- hdu 5532 Almost Sorted Array(最长上升(不下降)子序列和最长下降(不上升)子序列)
- 最长上升(下降)子序列 O(nlogn)
- pta L2-014. 列车调度 Dilworth定理(最少下降子序列数等于最长上升子序列长度)@
- 最长上升(不下降)子序列(详细,转)
- 蓝桥杯算法训练拦截导弹【最长上升子序列 & 最长非下降子序列nlogn 和 n^2】
- 求最长上升/下降子序列【O(nlgn)】
- 最长上升下降子序列
- 算法:最长上升下降子序列