Solution of CF1842C
Brief description of the title
若 \(a_i=a_j\) 且 \(1\le i < j\le |a|\)。则删除 \(a_{i}\) 到 \(a_j\) 所有数。求出能删除数列中的数的最大数量。
Solution
考虑动态规划:
状态:
\(f_i\) 表示前 \(i\) 个数里面最多能删除多少个数。
\(maxn_{a_i}\) 表示对于数 \(a_i\),满足 \(a_j=x\) 的最大的 \(f_{i-1}-j+1\) 的值。
状态转移方程
\[f_i=\max(f_{i-1},\max_{1\le j<i \wedge a_i=a_j}f_{j-1}+i-j+1)
\]
可化简为:
\[f_i=\max(f_{i-1},maxn_{a_i}+i+1)
\]
边界
\(f_0=0\)
答案
\(f_n\)
Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int Size=3e6+55;
const int infi=-100e7;//相当于1e9
signed main(){
int t;
cin>>t;
while(t--){
int a[Size],f[Size],maxn[Size],n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i],maxn[i]=infi;
for(int i=1;i<=n;i++){
f[i]=max(f[i-1],maxn[a[i]]+i+1);
maxn[a[i]]=max(maxn[a[i]],f[i-1]-i);
}
cout<<f[n]<<endl;
}
return 0;
}
本文来自博客园,作者:{_NightFire666_(洛谷uid 752555,欢迎关注)},转载请注明原文链接:https://www.cnblogs.com/NightFire666-blog/p/18487303