序列的美观度(dp连续的长度)

链接:https://ac.nowcoder.com/acm/contest/9983/I
来源:牛客网

设一个长度为m的序列S的美观度等于有多少个整数i满足1≤i≤m−1Si=Si+1,其中Si代表序列Si的第i个元素。
给出一个长度为n的序列a,问在他的所有子序列美观度最大是多少。
某个序列的子序列是从最初序列通过去除某些元素(也可以不去除,即序列本身也是子序列)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。

输入描述:

输出描述:

输出一个整数代表答案。
示例1

输入

复制
5
1 1 2 3 2

输出

复制
2

说明

美观度最大的子序列为[1,1,2,2]
示例2

输入

复制
7
1 1 2 2 2 1 1

输出

复制
4

样例二:序列是1 1 2 2 2 1 1


dp[i]为前i个数删掉部分数后能达到的最大美观度
这样只需要记录一下上一次出现a[i]这个数的位置即可
if(vis[a[i]]==0){
     dp[i]=dp[i-1];
}
else{
     dp[i]=max(dp[i-1],dp[vis[a[i]]]+1);
}
#include<iostream>
#include<algorithm>
#include<cstring> 
using namespace std;
const int maxn=1e6+100;
int vis[maxn];
int a[maxn];
int dp[maxn];
int main(){
    int n;
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    } 
    dp[1]=0;
    vis[a[1]]=1;
    for(int i=2;i<=n;i++){
        if(vis[a[i]]==0){
            dp[i]=dp[i-1];
        }
        else{
            dp[i]=max(dp[i-1],dp[vis[a[i]]]+1);
        }
        vis[a[i]]=i;
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        ans=max(ans,dp[i]);
    }
    cout<<ans<<endl;
}


原文地址:https://www.cnblogs.com/lipu123/p/14382400.html