CF1919B.Plus-Minus Split
入门
通过率:0%
时间限制:1.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
You are given a string s of length n consisting of characters "+" and "-". s represents an array a of length n defined by ai=1 if si= "+" and ai=−1 if si= "-".
You will do the following process to calculate your penalty:
- Split a into non-empty arrays b1,b2,…,bk such that b1+b2+…+bk=a†, where + denotes array concatenation.
- The penalty of a single array is the absolute value of its sum multiplied by its length. In other words, for some array c of length m, its penalty is calculated as p(c)=∣c1+c2+…+cm∣⋅m.
- The total penalty that you will receive is p(b1)+p(b2)+…+p(bk).
If you perform the above process optimally, find the minimum possible penalty you will receive.
† Some valid ways to split a=[3,1,4,1,5] into (b1,b2,…,bk) are ([3],[1],[4],[1],[5]), ([3,1],[4,1,5]) and ([3,1,4,1,5]) while some invalid ways to split a are ([3,1],[1,5]), ([3],[],[1,4],[1,5]) and ([3,4],[5,1,1]).
给你一个长度为 n 的字符串 s,它仅由字符 "+" 和 "-" 组成。该字符串表示一个长度为 n 的数组 a,其定义为:若 si= "+",则 ai=1;若 si= "-",则 ai=−1。
你将执行如下过程来计算你的罚分(penalty):
- 将数组 a 划分为若干个非空子数组 b1,b2,…,bk,使得 b1+b2+…+bk=a†,其中 + 表示数组的拼接(concatenation)。
- 单个子数组的罚分为其元素和的绝对值乘以其长度。换言之,对某个长度为 m 的数组 c,其罚分定义为 p(c)=∣c1+c2+…+cm∣⋅m。
- 你最终获得的总罚分为 p(b1)+p(b2)+…+p(bk)。
若你以最优方式执行上述过程,求你能获得的最小可能罚分。
† 对于 a=[3,1,4,1,5],一些合法的划分方式 (b1,b2,…,bk) 包括:([3],[1],[4],[1],[5])、([3,1],[4,1,5]) 和 ([3,1,4,1,5]);而一些非法的划分方式包括:([3,1],[1,5])、([3],[],[1,4],[1,5]) 以及 ([3,4],[5,1,1])。
输入格式
Each test contains multiple test cases. The first line contains a single integer t (1≤t≤1000) — the number of test cases. The description of the test cases follows.
The first line of each test case contains a single integer n (1≤n≤5000) — the length of string s.
The second line of each test case contains string s (si∈+,−, ∣s∣=n).
Note that there are no constraints on the sum of n over all test cases.
每个测试包含多个测试用例。第一行包含一个整数 t(1≤t≤1000),表示测试用例的数量。随后是各测试用例的描述。
每个测试用例的第一行包含一个整数 n(1≤n≤5000),表示字符串 s 的长度。
每个测试用例的第二行包含字符串 s(其中 si∈+,−,且 ∣s∣=n)。
注意:所有测试用例的 n 之和没有额外限制。
输出格式
For each test case, output a single integer representing the minimum possible penalty you will receive.
对于每个测试用例,输出一个整数,表示你将获得的最小可能罚分。
输入输出样例
输入#1
5 1 + 5 ----- 6 +-+-+- 10 --+++++++- 20 +---++++-+++++---++-
输出#1
1 5 0 4 4
说明/提示
In the first test case, we have a=[1]. We can split array a into ([1]). Then, the sum of penalties of the subarrays is p([1])=1.
In the second test case, we have a=[−1,−1,−1,−1,−1]. We can split array a into ([−1],[−1],[−1],[−1],[−1]). Then, the sum of penalties of the subarrays is p([−1])+p([−1])+p([−1])+p([−1])+p([−1])=1+1+1+1+1=5.
In the third test case, we have a=[1,−1,1,−1,1,−1]. We can split array a into ([1,−1,1,−1],[1,−1]). Then, the sum of penalties of the subarrays is p([1,−1,1,−1])+p([1,−1])=0+0=0.
在第一个测试用例中,我们有 a=[1]。我们可以将数组 a 分割为 ([1])。此时,各子数组的惩罚值之和为 p([1])=1。
在第二个测试用例中,我们有 a=[−1,−1,−1,−1,−1]。我们可以将数组 a 分割为 ([−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])。此时,各子数组的惩罚值之和为 p([1,−1,1,−1])+p([1,−1])=0+0=0。
输入解题思路,AI测评打分。不知道怎么写?