CF1919B.Plus-Minus Split

传统题 时间 2000 ms 内存 256 MiB 3 尝试 1 已通过 1 标签

Plus-Minus Split

题目描述

给定一个长度为 nn 的字符串 ss,由字符 “+” 和 “-” 组成。ss 表示一个长度为 nn 的数组 aa,其中当 sis_i 为 “+” 时 ai=1a_i=1,当 sis_i 为 “-” 时 ai=1a_i=-1

你需要按照如下过程计算你的惩罚值:

  1. 将数组 aa 拆分为若干个非空数组 b1,b2,,bkb_1,b_2,\ldots,b_k,使得 b1+b2++bk=ab_1+b_2+\ldots+b_k=a^\dagger,其中 ++ 表示数组拼接。
  2. 单个数组的惩罚值为其元素和的绝对值乘以其长度。即,对于长度为 mm 的数组 cc,其惩罚值为 p(c)=c1+c2++cmmp(c)=|c_1+c_2+\ldots+c_m| \cdot m
  3. 你最终获得的总惩罚值为 p(b1)+p(b2)++p(bk)p(b_1)+p(b_2)+\ldots+p(b_k)

如果你最优地进行上述操作,求你能获得的最小惩罚值。

^\dagger 一些将 a=[3,1,4,1,5]a=[3,1,4,1,5] 拆分为 (b1,b2,,bk)(b_1,b_2,\ldots,b_k) 的合法方式有 ([3],[1],[4],[1],[5])([3],[1],[4],[1],[5])([3,1],[4,1,5])([3,1],[4,1,5])([3,1,4,1,5])([3,1,4,1,5]),而一些不合法的拆分方式有 ([3,1],[1,5])([3,1],[1,5])([3],[],[1,4],[1,5])([3],[\,],[1,4],[1,5])([3,4],[5,1,1])([3,4],[5,1,1])

输入格式

每组测试数据包含多组测试用例。第一行包含一个整数 tt1t10001 \leq t \leq 1000),表示测试用例的数量。接下来是每组测试用例的描述。

每组测试用例的第一行包含一个整数 nn1n50001 \le n \le 5000),表示字符串 ss 的长度。

第二行包含字符串 sssi{+,}s_i \in \{ +, - \}s=n|s| = n)。

注意所有测试用例的 nn 之和没有额外限制。

输出格式

对于每组测试用例,输出一个整数,表示你能获得的最小惩罚值。

说明/提示

在第一个测试用例中,a=[1]a=[1]。我们可以将数组 aa 拆分为 ([1])([1])。此时子数组的惩罚值之和为 p([1])=1p([1]) = 1

在第二个测试用例中,a=[1,1,1,1,1]a=[-1,-1,-1,-1,-1]。我们可以将数组 aa 拆分为 ([1],[1],[1],[1],[1])([-1],[-1],[-1],[-1],[-1])。此时子数组的惩罚值之和为 $p([-1]) + p([-1]) + p([-1]) + p([-1]) + p([-1]) = 1 + 1 + 1 + 1 + 1 = 5$。

在第三个测试用例中,a=[1,1,1,1,1,1]a=[1,-1,1,-1,1,-1]。我们可以将数组 aa 拆分为 ([1,1,1,1],[1,1])([1,-1,1,-1],[1,-1])。此时子数组的惩罚值之和为 p([1,1,1,1])+p([1,1])=0+0=0p([1,-1,1,-1]) + p([1,-1]) = 0 + 0 = 0

由 ChatGPT 4.1 翻译

样例

5
1
+
5
-----
6
+-+-+-
10
--+++++++-
20
+---++++-+++++---++-
1
5
0
4
4

在线编程 IDE

建议全屏模式获得最佳体验