连续子序列 - 题目 - Daimayuan Online Judge
题意:
思路:
状态设计:dp[i]
含义:子序列结尾是a[i]的序列的最长子序列长度
状态转移:
直接去枚举上一个状态
上一个状态只能是一种:dp[a[i]-1]
因此不需要再一层for循环枚举从哪里转移过来
从dp[a[i]-1]转移过来
然后去输出方案,注意只需要输出一种方案即可
因此我们去找到第一个最大值对应的下标,然后输出方案即可
Code:
#include <bits/stdc++.h>
using namespace std;
const int mxn=2e5+10;
#define int long long
map<int,int> dp;
int n,mx=-1;
int a[mxn];
signed main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
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 it:dp){
if(it.second==mx){
cout<<it.second<<'\n';
int len=it.second;
for(int i=it.first-len+1;i<=it.first;i++) cout<<i<<" ";
cout<<'\n';
return 0;
}
}
}