二维动规。 字符串回文的处理思路


问题出处TP:

 ShortPalindromes - SRM 165 Div 2 
题目描述:给出一个字符串S(S0, sS1,....,Sn-1),求插入最少的字母使得该字符串成为回文
串,如果有很多,输出字典序最小的回文串。 

区间长度递增的顺序,即从长度1,2,3.。。到n的顺序。
也即 0-1, 1-2, 2-3 的顺序。
以长度为递增顺序来逐步DP。
所以子问题的求解,是针对当前字符串取哪个字符串的。
f[0][5] = min{ f[0][4]=0, f[1][5]=2}+1,

模型:状态转换式:
f[i][j]: 表示[i,j]区间内添加的最少字母数. 

f[i][j] = min(f[i][j-1], f[i+1][j])+1,(0<=i<n,i<=j<n, S[i] != S[j]) 

f[i][j] = min(f[i][j], f[i+1][j-1])(0<=i<n,i<=j<n, S[i] = S[j]) 

这种情况我认为应当是:

f[i][j] = f[i+1]f[j-1]。因为按照从区间长度递增的方式计算,f[i][j]是0,所以是最小的,没有比较的必要,任何这种情况的实际意义是一个规约问题,见分析

对于s[i] 和s[j] 相等于不相等两种情况,有不同的讨论。我的理解如下。

比如一个字符串:

a b c a
f[0][3] = minx{ f[i][j-1] , f[i+1][j]} = min{ f[0][2]=2, f[1][3]=2}

f[i+1][j-1] = 1;


由于,长度大的区间的f[i][j]是由长度短的发展而来。所以当首尾相等的时候,

直接将问题规约为求f[i+1][j-1]的最小值即可。它会比f[i][j-1],f[i+1][j]小或者等于。 


总结:动规的处理,除了状态的逐步转变,也可以是区间长度的转变,比如处理这种字符串回文的情况。

就是以区间的长度,作为状态转换因子。之前的转变都是一步一步的转变,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值