题面翻译
有一个大小为 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;
}
}