问题出处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 af[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]小或者等于。
总结:动规的处理,除了状态的逐步转变,也可以是区间长度的转变,比如处理这种字符串回文的情况。
就是以区间的长度,作为状态转换因子。之前的转变都是一步一步的转变,