链接:https://ac.nowcoder.com/acm/contest/9983/I
来源:牛客网
题目描述
设一个长度为\mathit mm的序列\mathit SS的美观度等于有多少个整数\mathit ii满足1\leq i \leq m-11≤i≤m−1且S_{i}=S_{i+1}S
代表序列\mathit SS的第\mathit ii个元素。
给出一个长度为\mathit nn的序列\mathit aa,问在他的所有子序列美观度最大是多少。
某个序列的子序列是从最初序列通过去除某些元素(也可以不去除,即序列本身也是子序列)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。
输入描述:
第一行一个正整数\mathit nn。
接下来一行\mathit nn个以空格分隔的正整数
解题思路
设dp[i]为第i位置最大的序列美观度,pre[a[i]]表示在i位置的字符在i-2位置之前出现的最近位置,求两者的最大值,就是判断要不去掉pre[a[i]]位置到i位置之间的字符
d
p
[
i
]
=
m
a
x
(
d
p
[
i
−
1
]
,
d
p
[
p
r
e
[
a
[
i
]
]
]
+
1
)
dp[i] = max(dp[i-1],dp[pre[a[i]]]+1)
dp[i]=max(dp[i−1],dp[pre[a[i]]]+1)
#include<cstdio>
#include<map>
using namespace std;
map<int,int> mp;
int dp[1000005],a[1000005];
int main()
{
int n;
scanf("%d",&n);
for(int i=0; i<n; ++i){
scanf("%d",&a[i]);
}
if(a[1]==a[0]){
dp[0] = 1;
}else dp[0] = 0;
for(int i=1; i<n; ++i){
if(mp[a[i]]){
dp[i] = max(dp[i-1],dp[mp[a[i]]]+1);
}
else{
dp[i] = dp[i-1];
}
mp[a[i]] = i;
}
printf("%d\n",dp[n-1]);
return 0;
}