本题题意:给出一个长度为n的字符串,求添加最少的字符数目,使得该字符串为一个对称的字符串。
题解:
对于Ab3bd 而言,反向翻转得到bd3bA
A b 3 b d
b d 3 b A
求这两个字符串的最长公共子串,对于非公共子串的字符,则需要添加一个相同的字符使该字符串能够对称。
问题转化为求最长公共子串问题。
由于题目空间大小有限,一种做法是将dp方程以short定义;
另外方法是进行滚动数组优化。
下文给出LCS常规思路,以及一种优化方法
原题地址 http://poj.org/problem?id=1159
##最长公共子串问题LCS:
给出两个子串A,B, 如
A B C B D A B
B D C A B A
最长公共子串为4: BCBA
递推公式: dp(i,j)为A,B当前长度为i,j的LCS
dp(i,j)=dp(i-1,j-1)+1 while A[i]==B[j]
dp(i,j)=max(dp(i-1,j),dp(i,j-1)) while A[i]!=B[j]
1|2|2|3|i-1,j-1||i-1,j
-|-------|----------
| | | | ||↖+1|↑
1 | 2|3|4|i,j-1|←|i,j
可见dp(i,j)是依赖于上一行的2个值,当前行的1个值;
由于直接变成一维数组,会导致i-1,j-1被当前行替换,因此只需提前保存上一行的