Tenzing and Balls

本文介绍了一个关于Tenzing的问题,她有一排球,颜色不同。她可以执行删除操作,每次选择颜色相同的球段。文章利用动态规划求解在给定次数的操作下,Tenzing能最多移除多少个球。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题面翻译

有一个大小为 n n n 的数组 a a a。你可以进行下列操作任意多次:

选择 i i i j j j,使 1 ≤ i < j ≤ ∣ a ∣ 1\leq i \lt j \leq |a| 1i<ja 并且 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 ji+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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值