• 序列的美观度(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;
    }


  • 相关阅读:
    3.1 history跳转页面产生跨域问题
    2021年6月7日 团队冲刺第二阶段04
    2021年6月6日 团队冲刺第二阶段03
    2021年6月5日 团队冲刺第二阶段02
    2021年6月4日 团队冲刺第二阶段01
    2021年6月3日
    2021年6月2日
    2021年6月1日
    2021年5月31日
    2021年5月30日
  • 原文地址:https://www.cnblogs.com/lipu123/p/14382400.html
Copyright © 2020-2023  润新知