序列的美观度(dp连续的长度)
链接:https://ac.nowcoder.com/acm/contest/9983/I
来源:牛客网
设一个长度为m的序列S的美观度等于有多少个整数i满足1≤i≤m−1且Si=Si+1,其中Si代表序列Si的第i个元素。
给出一个长度为n的序列a,问在他的所有子序列美观度最大是多少。
某个序列的子序列是从最初序列通过去除某些元素(也可以不去除,即序列本身也是子序列)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。
给出一个长度为n的序列a,问在他的所有子序列美观度最大是多少。
某个序列的子序列是从最初序列通过去除某些元素(也可以不去除,即序列本身也是子序列)但不破坏余下元素的相对位置(在前或在后)而形成的新序列。
输入描述:
输出描述:
输出一个整数代表答案。
示例2
输出
复制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; }