题目:输入一个字符串str,求其最长的回文子序列。
子串和子序列是不同的,
子串:构成子串的全部字符在原字符串中一定是连续相邻的;
子序列:其字符在原字符串中不一定连续相邻,字符的字典顺序与原字符串保持一致。
该问题能够分解为一系列子问题,故使用动态规划算法来解决。
dp[left][right] 表示:str[left] 到 str[right] 之间的字符,能够构成的回文子序列的最大长度。
状态初始条件:
if (left == right) //相同字符
dp[left][right] = 1; //回文子序列的长度为1
状态转移方程:
if (str[left] == str[right]) //子串的首尾字符相同
{
dp[left][right] = dp[left+1][right-1] +