题解:P11187 配对序列
D. 配对序列 (pairing) 官方题解
本题考查的主要知识点有:
- 【4】简单一维动态规划
送分
读题后不难发现测试点
对于测试点
前
如果考场上没有任何思路,那么这
朴素的 DP
题目也是让你求某种子序列的个数,类似求最长上升子序列,我们考虑 DP。
令
我们发现时间复杂度瓶颈在于每次转移需要枚举两个数。如果我们能把长度为奇数的子序列也写进某种 DP 里,那么每次转移只要枚举上一个数的位置。
令
转移
转移
时间复杂度
更优秀的 DP
经过观察,发现如果
对于
然而对于所有测试点,只记录
这样,总时间复杂度就是
#include<bits/stdc++.h>
using namespace std;
const int N=500005;
int n,a[N],even[N],odd[N],pre[N];
int main(){
scanf("%d",&n);
int b1=0,b2=0;
odd[0]=-1e9;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
if(a[b1]==a[i])
odd[i]=even[b2]+1;
else odd[i]=even[b1]+1;
even[i]=odd[pre[a[i]]]+1;
if(even[i]>=even[b1]){
if(a[i]!=a[b1])
b2=b1;
b1=i;
}
else if(even[i]>=even[b2] && a[i]!=a[b1])
b2=i;
pre[a[i]]=i;
}
printf("%d\n",even[b1]);
return 0;
}