动态规划区间dp经典问题--切割回文

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.代码实现

 

2b18fdaa4e8a4222833d60ccec0af630.jpg

 4.证明算法正确性

当字符串长度为1时,由于单个字符均为回文串,所以此时的切法是最优解。当字符串长度为n,且已经有所有长度为n–1的最少切分次数时,通过枚举切的位置以及判断是否为回文串,可以得到n即为最优解。由数学归纳法即可得证。

384c66e1ee07461697ecb2e18c55b442.jpg

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值