[UVA]10534 - Wavio Sequence(LIS最長上升子序列)
這題一看10000的數據量就知道必須用nlog(n)的時間復雜度。
所以特意去看了最長上升子序列的nlog(n)的算法。
如果有2個位置,該位置上的元素為A[i]和A[j],並且他們滿足以下條件:
1.dp[i] = dp[j] (dp[x]代表以x結尾的最長上升子序列長度)
2.A[i] < A[j]
3.i < j
那麼毫無疑問,選擇dp[i] 一定優於選擇dp[j]
那麼我們可以利用g[i]表示長度為i的序列的最後一個元素的最小值.
每次拿到一個A[i],在g[i]裡面尋找到一個元素,使得g[t] >= A[i].
dp[i] = t;
之後更新最小值 g[t] = A[i];
求最大下降子序列的話返回來遍歷一遍就行了。
之後 ans = max(ans, min(dp[i],dp[j]) * 2 - 1);
#include
#include
#include
#include
#include