具体来说,我们可以首先将区间分为 A 和 B 两部分。接下来,递归地执行分割与打印工作,并取最小值即可。
如何划分为 A 和 B 呢?暴力枚举分割点即可,不难知道分割点属于区间 [l,r-1], 这样 A 部分就是 s[:l+1], B 部分就是 s[l+1:r+1]。那么分别解决 A 和 B ,之后将其合并即可。而合并的代价是 0。直接套用上面的公式即可。
$f(i,j)=\max{f(i,k)+f(k+1,j)+cost}$
答案就是$ f(0, n - 1)$,其中 n 为字符串 s 的长度。
核心代码:
实际上上面的代码意思是:对于一次打印,必不会贯穿 A 和 B,也就是说至少要打印两次,一次是 A 部分的打印,一次是 B 部分的打印。之所以说至少是因为我们可能继续递归打印。
而对于 aaaaaa 这样的情况,很明显只需要打印一次,没有必要枚举分割点。
如何处理这种情况呢?实际上我们可以考虑从 l (左端点)位置开始打印,而结束的具体位置不确定,但可以确定的是增加 r 不会对结果有影响,也就是说 f(l, r-1) 等价于 f(l, r)。说人话就是从 l (左端点)开始打印的时候总可以顺便把 r 给打印了。这个算法可以扩展到任意 s[l] == s[r] 的情况,而不仅仅是上面的字符全部相等的情况。