题目:
样例输入:
9
8 4 2 5 3 9 1 6 7
样例输出:
4
思路:
要想得到最少的调度序列,那就要找出最少的下降序列的个数。拿上边的例子来说:有如下四个下降序列
8 4 2 1
5 3
9 6
7
所以只需要四个调度队列就可以了。
又根据定理:最小的下降序列的个数等于最长上升子序列的长度。(这个定理证明没看懂,直接懵逼,菜是原罪啊!!)剩下的就是一个裸的最长上升子序列问题了。
代码:
#include <bits/stdc++.h> #define inf 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn = 1e5+10; int a[maxn],dp[maxn]; int main() { int n; scanf("%d",&n); for(int i = 0; i<n; i++) { scanf("%d",&a[i]); dp[i] = inf; } int mmax = -1; for(int i = 0; i<n; i++) { int k = lower_bound(dp,dp+n,a[i])-dp; dp[k] = a[i]; mmax = max(mmax, k+1); } printf("%d ",mmax); return 0; }