题面翻译
有一个大小为 n n n 的数组 a a a。你可以进行下列操作任意多次:
选择 i i i 和 j j j,使 1 ≤ i < j ≤ ∣ a ∣ 1\leq i \lt j \leq |a| 1≤i<j≤∣a∣ 并且 a i = a j a_i=a_j ai=aj,
从数组中删除 a i , a i + 1 , … , a j a_i,a_{i+1},…,a_{j} ai,ai+1,…,aj
(并将 a j a_j aj 右边的所有元素的索引减少 j − i + 1 j−i+1 j−i+1)。
求出能删除数的最大数量。
注: ∣ a ∣ |a| ∣a∣ 表示 a a a 数组的大小。
题目描述
Enjoy erasing Tenzing, identified as Accepted!
Tenzing has $ n $ balls arranged in a line. The color of the $ i $ -th ball from the left is $ a_i $ .
Tenzing can do the following operation any number of times:
- select $ i $ and $ j $ such that $ 1\leq i < j \leq |a| $ and $ a_i=a_j $ ,
- remove $ a_i,a_{i+1},\ldots,a_j $ from the array (and decrease the indices of all elements to the right of $ a_j $ by $ j-i+1 $ ).
Tenzing wants to know the maximum number of balls he can remove.
输入格式
Each test contains multiple test cases. The first line of input contains a single integer $ t $ ( $ 1\leq t\leq 10^3 $ ) — the number of test cases. The description of test cases follows.
The first line contains a single integer $ n $ ( $ 1\leq n\leq 2\cdot 10^5 $ ) — the number of balls.
The second line contains $ n $ integers $ a_1,a_2,\ldots,a_n $ ( $ 1\leq a_i \leq n $ ) — the color of the balls.
It is guaranteed that sum of $ n $ of all test cases will not exceed $ 2\cdot 10^5 $ .
输出格式
For each test case, output the maximum number of balls Tenzing can remove.
样例 #1
样例输入 #1
2
5
1 2 2 3 3
4
1 2 1 2
样例输出 #1
4
3
提示
In the first example, Tenzing will choose $ i=2 $ and $ j=3 $ in the first operation so that $ a=[1,3,3] $ . Then Tenzing will choose $ i=2 $ and $ j=3 $ again in the second operation so that $ a=[1] $ . So Tenzing can remove $ 4 $ balls in total.
In the second example, Tenzing will choose $ i=1 $ and $ j=3 $ in the first and only operation so that $ a=[2] $ . So Tenzing can remove $ 3 $ balls in total.
分析
设a[i]==a[j],且假设j<i,那么[j,i]段可以去除
dp[i]表示前i位最大可去除的个数
那么dp[i]=max(dp[i-1],dp[j-1]+i-j+1)
可以看出式子中dp[j-1]-j这一块未知
使得dp[i]最大,即使dp[j-1]-j最大,使用mx来存储
对于a[i]来说dp[j-1]-j --> dp[i-1]-i
mx[a[i]]=max(mx[a[i]],dp[i-1]-i);
代码:
#include<bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int main()
{int T;cin>>T;while(T--){int n; cin >> n;vector<int> a(n + 1);vector<int> dp(n + 1);vector<int> mx(n + 1, -INF);for (int i = 1; i <= n; i++){scanf("%d", &a[i]);}for(int i=1;i<=n;i++){dp[i]=max(dp[i-1],mx[a[i]]+i+1);mx[a[i]]=max(mx[a[i]],dp[i-1]-i);}cout<<dp[n]<<endl;}
}