dp基础之划分型划分最小划分次数

本文介绍了一种动态规划方法来解决字符串的最小回文划分问题。通过定义状态f[i]表示字符串S的前i个字符最少可以划分成的回文串数量,利用回文串的性质,逐步计算出所有可能的划分次数,最终得到全局最优解。代码中详细解释了如何通过二维数组判断子串是否为回文,从而实现算法。
摘要由CSDN通过智能技术生成

问题:给定一个字符串S[0,..n-1],最少划分几次使得每个子串都是回文串

确定状态:最优策略中最后一段回文串是S[j...n-1]
    需要知道S前j个字符[0...j-1]最少可以划分成几个回文串
子问题:
设:S前i个字符[0...i-1]最少可以划分成f[i]个回文串
    f[i] = min{f[j]+1 | S[j...i-1]是回文串}
              {S前j个字符可以最少划分成几个回文串+最后一段回文串}
初始条件:
f[0] = 0,前0个即空串是0
计算顺序:f[0]...f[n]

判断回文串:

分为奇数长度回文串和偶数长度回文串。
对每个字符进行枚举,两边扩展,建立一个二维数组,huiwen[i][j]表示字符串S[i...j]是否是回文串,1表示是,0表示不是

 

代码及注释如下:

import sys
def min_huiwen(S):
    n = len(S)
    if n == 0:
        return 0
    #创建一个二维数组huiwen[i][j]表示字符串S[i...j]是否是回文串,初始为0,即都不是回文串
    huiwen = [[0 for i in range(n)] for j in range(n)]
    #赋值huiwen[][j]
    for t in range(n):
        #对于奇数长度回文串,从t向两头拓展
        i = t
        j
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值