1.普通O(n^2)复杂度
for(int i=0;i<n;i++)
{
dp[i]=1;//dp表示包含第i个数的最长上升子序列
for(int j=0;j<i;j++)
{
if(a[j]<a[i])dp[i]=max(dp[i],dp[j]+1);
//如果前某一个数比该数小,则该数的dp=max...
}
ans=max(ans,dp[i]);
}
2.O(nlogn)复杂度
#deifne INF 0x3f3f3f
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
dp[i]=INF;//dp[i]表示长度为i+1的子序列末尾元素最小值;
//不可以用memset对数组赋值INF,只能赋值0或-1;
//可以用fill(dp,dp+n,INF);
}
for(int i=0;i<n;i++)
{
*lower_bound(dp,dp+n,a[i])=a[i];//找到>=a[i]的第一个元素,并用a[i]替换;
}
int ans = lower_bound(dp,dp+n,INF)-dp;//找到第一个INF的地址减去首地址就是最大子序列的长度;
或
//部分摘要