区间dp, 从两侧向中间缩减范围, 子序列问题本质上是选或不选, 如果两侧的字母一致, 说明能都选, 状态 -> dfs(i+1, j-1), 如果两侧的字母不一致, 说明不能都选

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
char[] str;
int[][] m;
/**
* 区间dp, 从两侧向中间缩减范围, 子序列问题本质上是选或不选,
* 如果两侧的字母一致, 说明能都选, 状态 -> dfs(i+1, j-1),
* 如果两侧的字母不一致, 说明不能都选
*/
public int longestPalindromeSubseq(String s) {
str = s.toCharArray();
m = new int[s.length()][s.length()];
return dfs(0, s.length()-1);
}

private int dfs(int i, int j) {
if (i > j) return 0;
if (i == j) return 1;
if (m[i][j] != 0) return m[i][j];
if (str[i] == str[j]) return m[i][j] = dfs(i+1, j-1) + 2;
return m[i][j] = Math.max(dfs(i, j-1), dfs(i+1, j));
}
}

Comments
Recent Posts
计算机网络
进程树
进程管理
Categories
Website Info
Article Count :
4
Total Word Count :
14.4k
Unique Visitors :
Page Views :
Last Update :