====接力dalao完成====
对前文的一些补充:
首先清楚最长不下降子序列是一个递增但是允许不同位元素相等的序列。而最长上升子序列则是一个单调递增的序列。
而两者都是子序列,所以子序列的长度一定小于等于原序列。且子序列在原序列的位置不一定连续。
这个O(nlogn)的算法使用的是贪心的思想。
为了帮助理解,请与以下代码对比阅读:
#include
using namespacestd;int a[1000001],dp[1000001];intans;intn;intmain()
{
cin>>n;for(int i=1;i<=n;i++)
{
cin>>a[i];
}for(int i=2;i<=n;i++)
{for(int j=1;j<=i;j++)
{if(a[j]
dp[i]=max(dp[j]+1,dp[i]);//暴力从原序列中找比当前位置小的数,并不断更新当前位置的最长序列值(比较好理解)//想不懂就。。。再想想吧//
}
ans=max(dp[i],ans);
}
cout<
}
这个是O(n2)的暴力算法,大概思路就是每次选取一个终点,再暴力求出终点的最长序列值,再从答案中选取最大值。
而O(nlogn)的实现过程与这个正好相反。
因为每次暴力更新都会有很