最大上升子序列&最大下降子序列

一、基础

for(int i=1;i<=n;i++){
     for(int j=1;j<i;j++)
       if(a[j]<a[i]) f[i]=max(f[i],f[j]+1);
     ans=max(ans,f[i]);
  }

二、复杂度o(nlogn)

    cin>>n>>k;
    for(int i=0;i<n;i++){
        cin>>a[i];
        dp[i]=inf;
        pd[i]=inf;
    }
    for(int i=n-1;i>=0;i--)//这里还是队友提醒,如何从找最大上升去找最大下降,只要把原数组倒过来
            b[n-i-1]=a[i];
    for(int i=0;i<n;i++)
    *lower_bound(dp,dp+n,a[i])=a[i];//找到>=a[i]的第一个元素,并用a[i]替换; //上升
    for(int i=0;i<n;i++)
    *lower_bound(pd,pd+n,b[i])=b[i];//找到<=a[i]的第一个元素,并用b[i]替换;//下降 
    int ans1=lower_bound(dp,dp+n,inf)-dp;
    int ans2=lower_bound(pd,pd+n,inf)-pd;

友情链接

猜你喜欢

转载自blog.csdn.net/miranda_ymz/article/details/81072515