Educational Codeforces Round 61 (Rated for Div. 2) F. Clear the String [dp学习笔记]

题目大意:给定一个字符串s,可以不断删除连续子串使字符串缩短,求最小的操作数使得字符串为空

 

本题的关键是怎样处理连续子串。假如字符串中有相同的字符,如“aba”,那么删除b后“aa”就会变成连续子串,接下来一口气删掉两个a就结束了。因此一个有效的策略就是寻找相同的字符,删除它们中间的字符使得这两头的字符能拼成连续子串以便减少操作数。

 

设dp(l,r)为删除[l,r]区间的最小操作数,则情况可以分为两种:

(1) [l+1,r]中没有与s[l]相同的字符

     s[l] 无法和任何字符拼成连续子串,直接删掉s[l]

      dp(l,r) = min\{ dp(l,r) , 1+dp(l+1,r) \}

(2) [l+1,r]中有与s[l]相同的字符s[k]

      dp(l,r)=min\{dp(l,r) , dp(l+1,k-1)+dp(k,r)\}

      说明:若k-1<l+1,说明s[l]和s[k]紧贴着,不需要它们删除中间的子串,此时dp(l+1,k-1)应返回0。 dp(k,r)表示删除[k,r]中的元素,因为s[l]和s[k,r]中的元素被删除,s[l]和s[k,r]连在了一起,所以在删除s[k,r]的时候s[l]也会被删除,实现了删除连续子串的效果

    

 

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页