题意简述
Vlad 找到了一条由 $n$ 个单元格组成的带子,带子的编号从左到右依次为 $1$ 到 $n$。在第 $i$ 个单元格中,有一个正整数 $a_i$ 和一个字母 $s_i$,所有的 $s_i$ 要么是 ‘L’,要么是 ‘R’。
Vlad 邀请你尝试通过执行任意次数(可能为零)的操作来获得尽可能多的分数。
在一个操作中,你可以选择两个索引 $l$ 和 $r$($1 \le l < r \le n$),使得 $s_l = ‘L’$ 并且 $s_r = ‘R’$,然后执行以下操作:
- 将 $al + a{l + 1} + \dots + a_{r - 1} + a_r$ 的值添加到当前分数中;
- 将所有满足 $l \le i \le r$ 的 $s_i$ 替换为 ‘.’,这意味着你不能再选择这些索引。
Vlad 能够获得的最大分数是多少?
思路分析
结论:答案一定是由若干完全嵌套的 L-R
对组成的。可以使用双指针从大到小搜索。
理由分析:
操作规则:每次操作都是将一段连续的
L
和R
之间的部分选出并累加分数,且一旦选中,这部分的单元格将无法再使用。因此,任何两个不同的L-R
对之间的区间不能有交集。非相交的特性:假设存在两组
L-R
对,记为 $(l_1, r_1)$ 和 $(l_2, r_2)$,满足 $l_1 < l_2 < r_1 < r_2$ 或 $l_2 < l_1 < r_2 < r_1$,那么这两组对可以合并成一个L-R
对 $(l_1, r_2)$ 或 $(l_2, r_1)$,这样可以获得更大的分数。同层嵌套的合并:如果存在多个
L-R
对在同一个嵌套层级(如**L**R**L**R**
),那么将这些对合并为一个更大的L-R
对会得到不小于原来的分数,并且减少了操作次数。
解题步骤
初始化:创建两个指针 $l$ 和 $r$,分别指向左边界和右边界,初始时 $l = 1$,$r = n$。
寻找嵌套对:从右向左移动 $r$,从左向右移动 $l$,找到满足条件的
L
和R
。计算分数并更新状态:每找到一对 $(l, r)$,计算该区间的分数和,将其添加到总分数中.
继续查找:重复步骤 2 和 3,直到无法找到新的
L-R
对。输出结果:最终累加的分数即为 Vlad 能够获得的最大分数。