1. 程式人生 > >O(n log n)求最長上升子序列與最長不下降子序列

O(n log n)求最長上升子序列與最長不下降子序列

clas 每一個 for spa pen pan close color style

考慮dp(i)表示新上升子序列第i位數值的最小值.由於dp數組是單調的,所以對於每一個數,我們可以二分出它在dp數組中的位置,然後更新就可以了,最終的答案就是dp數組中第一個出現正無窮的位置。

代碼非常簡單:

技術分享
 for(int i=0;i<n;i++)dp[i]=oo;
 for(int i=0;i<n;i++)*lower_bound(dp,dp+n,A[i])=A[i];
 printf("%d\n",(lower_bound(dp,dp+n,oo)-dp)); 
View Code

如果是最長不下降子序列的話只需要把第二行的lower_bound改成upper_bound就可以了。

如果是最長下降子序列或者最長不上升子序列的話只需要把原序列倒過來做一遍就好了。

O(n log n)求最長上升子序列與最長不下降子序列