两种思路
1.第一种思路模板是一个一维的dp数组
int n = array.length;
int[] dp = new int[n];
for (int i = 1; i < n; i++) {
for (int j = 0; j < i; j++) {
dp[i] = 最值(dp[i], dp[j] + ...)
}
}
在子数组arr[0…i]中,我们要求的子序列长度是dp[i]。
2.第二种思路模板是一个二维的dp数组
int n = arr.length;
int[][] dp = new dp[n][n];
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
if (arr[i] == arr[j])
dp[i][j] = dp[i][j] + ...
else
dp[i][j] = 最值(...)
}
}
2.1 涉及两个字符串/数组的场景,dp 数组的定义如下:
在子数组 arr1[0…i] 和子数组 arr2[0…j] 中,我们要求的子序列长度为 dp[i][j]。
2.2 只涉及一个字符串/数组的场景,dp 数组的定义如下:
在子数组 array[i…j] 中,我们要求的子序列的长度为 dp[i][j]。