题目:
分析:
这个题简化了难度,相当于将原本要求的严格单调上升子序改成了连续的子序,只需要再前一个数字的基础上+1即可
dp[x] = max(dp[x], dp[x-1] + 1);x表示当前第i个元素a[i]
由于是连续的,所以如果有他前一个数字我们就给他+1,或者或者不变
还有就是a[i]的范围是1e9范围地,且不能做映射处理所以我们使用map来定义dp数组
代码:
#include <bits/stdc++.h>
using namespace std;
const int N = 200010;
int n;
int a[N];
map<int, int> dp;
int main()
{
cin >> n;
for (int i = 1; i <= n; i ++ ) scanf("%d", &a[i]);
int mx = 0;
for (int i = 1; i <= n; i ++ )
{
dp[a[i]] = max(dp[a[i]], dp[a[i] - 1] + 1);
mx = max(mx, dp[a[i]]);
}
for (auto &p : dp)
{
if (p.second == mx)
{
cout << mx << endl;
for (int i = p.first - mx + 1; i <= p.first; i ++ )
cout << i << " ";
cout << endl;
return 0;
}
}
}