zoukankan      html  css  js  c++  java
  • 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的暴力解法思路真不一样

  • 相关阅读:
    POJ 2976 Dropping tests
    【学习笔记-中国剩余定理】POJ1006 Biorhythms
    2017.10.6北京清北综合强化班DAY6
    P1607 [USACO09FEB]庙会班车Fair Shuttle
    2017.10.5北京清北综合强化班DAY5
    洛谷 P1379 八数码难题
    A. 拼音魔法
    A
    K
    A
  • 原文地址:https://www.cnblogs.com/holidays/p/leetcode_note5.html
Copyright © 2011-2022 走看看