概念
多个序列类的。
题目
- Longest Palindromic Subsequence : 求最长
- 712. Minimum ASCII Delete Sum for Two Strings :求最值
- 718. Maximum Length of Repeated Subarray : 求最值
Longest Palindromic Subsequence
方法一 : 递归 + memo
方法二 : 递推 + memo
区间型DP做法
参考
class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int[][] dp = new int[len][len];
for(int i = len - 1; i >= 0; i --){
dp[i][i] = 1;
for(int j = i + 1; j < len; j ++){
if(s.charAt(i) == s.charAt(j)){
dp[i][j] = dp[i+1][j-1] + 2;
}
else{
dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1]);
}
}
}
return dp[0][len - 1];
}
}
方法三: 递推+memo
双序列型做法,可将本题转换为LCS:单个字符串的最长回文子序列,就是将该字符串翻转后,求与原序列的Longest Common Subsequence.
class Solution {
public int longestPalindromeSubseq(String s) {
int len = s.length();
int[][] dp = new int[len+1][len+1];
String r = new StringBuffer(s).reverse().toString();
for(int i = 0; i <= len; i ++){
dp[0][i] = 0;
dp[i][0] = 0;
}
for(int i = 1; i <= len; i ++){
for(int j = 1; j <= len; j ++){
if(s.charAt(i-1) == r.charAt(j-1)){
dp[i][j] = dp[i-1][j-1] + 1;
}
else{
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}
return dp[len][len];
}
}
712. Minimum ASCII Delete Sum for Two Strings
方法一:
class Solution {
public int minimumDeleteSum(String s1, String s2) {
char[] arr1 = s1.toCharArray();
char[] arr2 = s2.toCharArray();
int[][] dp = new int[arr1.length+1][arr2.length+1];
for(int i = 0; i <= arr1.length; i ++){
for(int j = 0; j <= arr2.length; j++){
if(i == 0 && j == 0){
dp[0][0] = 0;
}
else if(i == 0){
dp[i][j] = dp[i][j-1] + arr2[j-1];
}
else if(j == 0){
dp[i][j] = dp[i-1][j] + arr1[i-1];
}
else{
if(arr1[i-1] == arr2[j-1]){
dp[i][j] = dp[i-1][j-1];
}
else{
dp[i][j] = Math.min(dp[i-1][j] + arr1[i-1], dp[i][j-1] + arr2[j-1]);
}
}
}
}
return dp[arr1.length][arr2.length];
}
}
718. Maximum Length of Repeated Subarray
方法一 : 递推 + memo
这道题自己是没理清楚状态关系的,仔细对比与Longest Common Subsequence
class Solution {
public int findLength(int[] A, int[] B) {
int[][] dp = new int[A.length + 1][B.length + 1];
int res = 0;
for(int i = 0; i < A.length; i ++){
for(int j = 0; j < B.length; j ++){
if(A[i] != B[j]){
dp[i+1][j+1] = 0;
}
else{
dp[i+1][j+1] = dp[i][j] + 1;
}
res = Math.max(res, dp[i+1][j+1]);
}
}
return res;
}
}
方法二 : 暴力解法
grandyang的暴力解法思路真不一样