2021牛客寒假算法基础集训营3 I.序列的美观度(dp)

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;
}

猜你喜欢

转载自blog.csdn.net/weixin_45894701/article/details/113740477
今日推荐