Description
求最长不下降子序列的长度。
Input
第一行为n,表示n个数(n<=5000)。
第二行输入n个数(int范围内)。
Output
最长不下降子序列的长度。
Samples
input Copy
3
1 2 3
output Copy
3
之前写过求最长严格递增子序列的长度的代码,今天写一个求最长非降子序列长度,有始有终hhh
解题思路:
遍历数组的每一个数,去和子序列的最后一个数x(从小到大排序)进行比较,如果a[i]>=x,就把a[i]放于序列中,否则找到子序列中第一个>=a[i]的数字y并把y替换为a[i]。
同样的是,此种方法仅限于求出其长度,不能保证求序列正确性。
ac代码:
#include <bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n;
cin >> n;
vector<int> v;
int a[5010];
for (int i=1;i<=n;i++)
{
cin >> a[i];
}
v.push_back(a[1]);
for (int i=2;i<=n;i++)
{
if(a[i]>=v.back()) v.push_back(a[i]);
else
{
*upper_bound(v.begin(),v.end(),a[i]) = a[i];
}
}
cout << v.size();
return 0;
}