1.题目内容
给定一个字符串,问对字符串s最少要切几刀,使其每个部分都为回文串。(一个字符是回文串)
2.题目分析
根据容斥原理分析,如果当前字符串已经是回文串了,那么一刀都不用切,否则我们就要切一刀以上。
对于该区间dp问题,我们可以把长度作为更新方向,即从字符串长度为1开始,一直更新到字符串长度为n。
在切一刀以上的情况中,由于动态规划是分析最优子结构的问题,那我们不妨假设当前切的是最后一刀,当前切到的任意一处地方两边都已经是最优切法了。那么我们只需要遍历最后一刀所有切的位置,在这些位置中找出切的最少的即可。
我们设dp[n][m]为起始位置为n,结束位置为m的字符串全部切成回文串需要的刀数。(左闭右开,dp[1][2]只包含一个1)。
dp[n][m]=max(dp[n][k] + dp[k+1][m] + 1),k等于从n到m-1的所有数。
3.代码实现
4.证明算法正确性
当字符串长度为1时,由于单个字符均为回文串,所以此时的切法是最优解。当字符串长度为n,且已经有所有长度为n–1的最少切分次数时,通过枚举切的位置以及判断是否为回文串,可以得到n即为最优解。由数学归纳法即可得证。