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;
	}
posted @ 2024-10-20 14:57  夜·煞  阅读(5)  评论(1编辑  收藏  举报