题意
给定一个字符串,找最长回文子序列。
思路
今天好像刚加的新题?花了2min切掉了。
状态表示:d[i,j],区间[i, j]的最长回文子序列。
转移方程:
- si==sj: d[i,j]=d[i+1,j−1]+2
- si≠sj: d[i,j]=max(d[i+1,j],d[i,j−1])
代码
const int maxn = 1005;
int d[maxn][maxn];
class Solution {
public:
string s;
int dfs(int i, int j) {
if (d[i][j] != -1) return d[i][j];
if (i > j) return d[i][j] = 0;
if (i == j) return d[i][j] = 1;
if (s[i] == s[j]) return d[i][j] = dfs(i + 1, j - 1) + 2;
return d[i][j] = max(dfs(i + 1, j), dfs(i, j - 1));
}
int longestPalindromeSubseq(string ss) {
s = ss;
int n = s.length();
if (!n || n == 1) return n;
memset(d, -1, sizeof(d));
return dfs(0, n - 1);
}
};

本文介绍了一种解决最长回文子序列问题的方法。通过动态规划的方式,定义了状态d[i,j]表示区间[i,j]内的最长回文子序列长度,并给出了相应的转移方程。代码实现使用递归加记忆化搜索,有效地避免重复计算。

被折叠的 条评论
为什么被折叠?



