leetcode动态规划笔记五---双序列型

概念

多个序列类的。

题目

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的暴力解法思路真不一样

猜你喜欢

转载自www.cnblogs.com/holidays/p/leetcode_note5.html