最长上升子序列2
时间限制:1秒 内存限制:64M
题目描述
给定一个长度为 N 的数列,求数值严格单调递增的子序列的长度最长是多少。
输入描述
第一行包含整数 N。
第二行包含 N 个整数,表示完整序列。
输出描述
输出一个整数,表示最大长度。
样例
输入
7 3 1 2 1 8 5 6
输出
4
提示
N<=1e5
−10^9≤数列中的数≤10^9
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e5+2;
long long a[N],sum[N],ans;
int main() {
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
ans=1;
sum[ans]=a[1];
for(int i=2;i<=n;i++){
if(a[i]>sum[ans]){
ans++;
sum[ans]=a[i];
}
else{
int x=lower_bound(sum+1,sum+ans+1,a[i])-sum;
sum[x]=a[i];
}
}
cout<<ans<<endl;
return 0;
}
解题步骤:
- 首先,我们需要读取输入的序列长度和序列本身。
- 然后,我们可以使用动态规划的方法来求解最长单调递增子序列的长度。我们可以定义一个数组dp,其中dp[i]表示以第i个元素结尾的最长单调递增子序列的长度。状态转移方程为:dp[i] = max(dp[j]) + 1,其中0 <= j < i且nums[j] < nums[i]。
- 最后,我们输出dp数组中的最大值,即为最长单调递增子序列的长度。