最长上升序列、最长下降序列及其变形模板
2018-03-07 01:35
344 查看
#include <bits/stdc++.h> using namespace std; #define _for(i,a,b) for(int i=a;i<=b;i++) const int maxn = 107; int n,dp1[maxn],dp2[maxn],a[maxn],sum1[maxn],sum2[maxn]; int check(int x,int y)//下降序列 { int l = 1; int r = y; int ans = 0; while(l<=r) { int mid = (l+r)/2; if(dp1[mid]<x) { r = mid-1; ans = mid; } else l = mid+1; } return ans; } int checkgo(int x,int y)//上升序列 { int l = 1; int r = y; int ans = 0; while(l<=r) { int mid = (l+r)/2; if(dp2[mid]>=x) { r = mid-1; ans = mid; } else l = mid+1; } return ans; } int num(int x,int y) { memset(dp1,0,sizeof(dp1)); int ans = 1; dp1[x]=a[x]; _for(i,x+1,y) { if(dp1[ans]>a[i]) { dp1[++ans]=a[i]; } else { int k = check(a[i],ans); dp1[k]=a[i]; } } return ans; } int num2(int x,int y) { memset(dp2,0,sizeof(dp2)); dp2[x]=a[x]; int ans2 = 1; _for(i,x+1,y) { if(dp2[ans2]<a[i]) { dp2[++ans2]=a[i]; } else { int k = checkgo(a[i],ans2); dp2[k]=a[i]; } } return ans2; } int main(int argc, char const *argv[]) { cin>>n; _for(i,1,n)cin>>a[i]; int ans = 0; _for(i,1,n)sum1[i]=num2(1,i); _for(i,1,n)sum2[i]=num(i,n); _for(i,1,n)cout<<sum2[i]<<" "<<sum1[i]<<endl; return 0; }
相关文章推荐
- POJ3670Eating Together(LIS最长(非)上升(下降)子序列模板)
- 最长上升子序列、最长下降子序列的DP算法由O(n^2)到O(nlogn)算法实现及其优化
- LIS(Longest Increasing Subsequence)最长上升(不下降)子序列
- 最长不下降子序列(可以改成最长上升子序列)
- hdu4512(最长上升公共子序列变形)
- 动态规划 最长上升(下降)子序列 SDNUOJ 1040 导弹拦截和最少拦截系统
- array array array (最长上升子序列变形)
- 最长上升子序列的变形
- HDU Problem E [ 最长下降子序列 堆箱子]——基础dp模板题变式
- hdu5489(最长上升子序列变形)
- BZOJ1046(HAOI2007)[上升序列]--最长下降子序列预处理
- array array array (最长上升子序列变形)
- LIS(Longest Increasing Subsequence)最长上升(不下降)子序列
- 最长上升子序列及其实际问题小结
- poj3616(最长上升子序列变形)
- array array array (最长上升子序列变形)
- 求最长上升/下降子序列【O(nlgn)】
- ACM模板——最长公共上升子序列 LCIS
- joj 2529 Chorus 动态规划 最长上升子序列和最长下降子序列
- hdu 1087 Super Jumping! Jumping! Jumping!(最长上升子序列变形)