Problem Description
给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
Input Format
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。
Output Format
输出一个整数,表示最大长度。
Scope of Data
1 ≤ N ≤ 100000,
−109 ≤ 数列中的数 ≤ 109
Sample Input
7
3 1 2 1 8 5 6
Sample Output
4
Idea
Program Code
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 100010;
int n;
int maxlen; //设全局最大值
int num[N];
int main()
{
cin >> n;
for(int i = 0; i < n; ++ i)
cin >> num[i]; //输入项
int t,dp[n];
/***
dp数组中的数字并没有意义!!!
把dp当作到现在元素为止的最大上升子序列,那么当来了一个新元素后:
---如果这个元素的值大于dp最后一个元素,则直接将其添加到dp尾部;
---若小于等于,则用二分搜索的方法找出它该放的位置(第一个大于或等于它的数的位置)并替代原来的数。
!!!得到的dp有可能不再是原先数组的子序列,但是递增子序列的长度没有改变。
***/
for(int i = 0; i < n; ++ i)
{
t = lower_bound(dp, dp + maxlen, num[i]) - dp; //查找第一个大于或等于某个元素的位置
dp[t] = num[i];
if(t >= maxlen)
maxlen ++;
}
cout << maxlen << endl;
return 0;
}
- If you have any questions,please feel free to communicate with me.