题意:给定一串数组,求最长的每个数比其上一个数大一的子序列
解析:
刚开始以为是最长上升子序列的变形,然后就在网上找了半小时的代码,最后才发现是一道并不难的题
#include <bits/stdc++.h>
#define ll long long
#define pb push_back
#define inf 0x3f3f3f3f
#define pll pair<ll,ll>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define rep1(i,a,b) for(int i=a;i>=b;i--)
#define rson rt<<1|1,m+1,r
#define lson rt<<1,l,m
using namespace std;
const int N=2e5+100;
int n, arr[N], f[N], ans, maxi, las[N];
map<int, int> mp;
/*
对于每个位置,用f[i]表示以位置i为结束的序列的长度
用map记录这个数字的位置
las数组记录这个位置的上一个位置
最后用递归逆序输出即可(当然也有别的输出方法)
*/
void outp(int x)
{
if (x == 0) return;
outp(las[x]);
cout<<x<<' ';
}
int main()
{
cin>>n;
f[0] = 0;
maxi = 0;
for (int i = 1; i <= n; i++)
{
cin>>arr[i];
f[i]=f[mp[arr[i]-1]] + 1;
las[i]=mp[arr[i]-1];
mp[arr[i]]=i;
if (f[i]>maxi) maxi=f[i], ans=i;
}
cout<<maxi<<endl;
outp(ans);
cout<<endl;
return 0;
}
本文介绍了一种高效算法来解决寻找数组中最长等差子序列的问题,并提供了完整的C++实现代码。通过使用map记录元素及其位置,该算法能够快速确定最长子序列及其构成。
1142

被折叠的 条评论
为什么被折叠?



