I.序列的美观度
题目链接:https://ac.nowcoder.com/acm/contest/9983/I
题目描述:
设一个长度为m的序列S的美观度等于有多少个整数i满足1 ≤ i ≤ m−1且S i = S i+1其中S i代表序列S的第i个元素。
给出一个长度为n的序列a,问在他的所有子序列美观度最大是多少。
某个序列的子序列是从最初序列通过去除某些元素(也可以不去除,即序列本身也是子序列)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。
输入描述:
第一行一个正整数n。
接下来一行n个以空格分隔的正整数a i。
2≤ n ≤10^6
1≤ ai ≤10^6
输出描述:
输出一个整数代表答案。
示例1:
输入
5
1 1 2 3 2
输出
2
说明
美观度最大的子序列为[1,1,2,2]
示例2:
输入
7
1 1 2 2 2 1 1
输出
4
解题思路:
dp
dp[i]表示前i个字符的最大美观度
①不选i/选了i但i与前一个不同 dp[i] = dp[i-1]
②选了i,i接在和它相同的数之后(i与前一个相同) dp[i] = dp[pre[a[i]]] + 1 (pre[a[i]]是前一个a[i]所在的位置。)
代码如下:
#include<iostream>
#include<cstdio>
using namespace std;
int dp[1000010],a[1000010],pre[1000010];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
if(pre[a[i]] != 0)
dp[i]=max(dp[i-1],dp[pre[a[i]]]+1);
else
dp[i] = dp[i-1];
pre[a[i]] = i;
}
cout<<dp[n]<<endl;
return 0;
}