[39] (Plantilla de resolución de problemas de subsecuencia de programación dinámica) La subsecuencia creciente más larga | la subsecuencia palíndromo más larga (LC 300 | 516)

Plantilla dinámica de resolución de problemas de subsecuencia de programación

1. Matriz dp unidimensional

modelo:

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] + ...)
    }
}

El significado de dp [i]: En la matriz de submatriz [0 ... i], la longitud de la subsecuencia de destino que termina en la matriz [i] es dp [i]. (Similar a ésto)

Ejemplo: la subsecuencia creciente más larga

Descripción del problema

Darle una matriz de números enteros y encontrar la longitud de la subsecuencia estrictamente creciente más larga.

Una subsecuencia es una secuencia derivada de una matriz, que elimina (o no elimina) elementos de la matriz sin cambiar el orden de los elementos restantes. Por ejemplo, [3,6,2,7] es una subsecuencia de la matriz [0,3,1,6,2,2,7].

Ideas para resolver problemas

Defina dp [i] para representar la longitud de la subsecuencia creciente más larga que termina con nums [i] . Si se requiere dp [i], entonces max (dp [1], dp [2],…, dp [i-1] ), asumiendo max (dp [1], dp [2],…, dp [i-1]) = dp [j], entonces si nums [i]> nums [j], entonces dp [i] = dp [ j] + 1; de lo contrario, dp [i] permanece sin cambios.

Código

class Solution {
    
    
    public int lengthOfLIS(int[] nums) {
    
    
        int n = nums.length;//求出数组元素个数
        if(n == 0) //若数组为空,返回0
            return 0;
        int dp[] = new int[n];//dp[i]表示以nums[i]结尾的最大递增子序列长度
        int result = -1;
        for(int i=0;i<n;i++){
    
    
            dp[i] = 1; //初始都为1
            for(int j=0;j<i;j++){
    
    //dp[0]开始
                if(nums[i]>nums[j])//若nums[i]>nums[j]则dp[i]可以为dp[j]+1,否则对dp[i]不做处理
                    dp[i] = Math.max(dp[i],dp[j]+1);
            }
            result = Math.max(dp[i],result);
        }
        return result;
    }   
}

Complejidad temporal: O (n ^ 2)
Complejidad espacial: O (n)

2. Matriz dp bidimensional

modelo:

int n = arr.length;
int[][] dp = new dp[n][n];

for (int i = 0; i < n; i++) {
    
    
    for (int j = 1; j < n; j++) {
    
    
        if (arr[i] == arr[j]) 
            dp[i][j] = dp[i][j] + ...
        else
            dp[i][j] = 最值(...)
    }
}

El significado de dp [i] [j]:

  • Cuando hay dos cadenas / arreglos involucrados: En el subarreglo arr1 [0 ... i] y el subarreglo arr2 [0 ... j], la longitud de la subsecuencia que requerimos es dp [i] [ j]. Ejemplo: editar distancia, subsecuencia común más larga ...
  • Cuando solo está involucrada una cadena / arreglo: En el arreglo de subarreglo [i ... j], la longitud de la subsecuencia que requerimos es dp [i] [j]. Ejemplo: la subsecuencia de palíndromo más larga ...

Ejemplo: la subsecuencia palíndromo más larga

Descripción del problema

Dada una cadena s, busque la subsecuencia palíndromo más larga y devuelva la longitud de la secuencia. Se puede suponer que la longitud máxima de s es 1000.

Ideas para resolver problemas

Defina dp [i] [j] como la longitud de la subsecuencia palíndromo más larga en la subcadena s [i,…, j], asumiendo que dp [i + 1] [j-1] se conoce en este momento, entonces si s [i] == s [j], luego dp [i] [j] = dp [i + 1] [j-1] + 2; de lo contrario, es igual a max (dp [i + 1] [j], dp [i] [j-1]).

Código

class Solution {
    
    
    public int longestPalindromeSubseq(String s) {
    
    
        int n = s.length();
        if(n == 0) return 0;
        int dp[][] = new int[n][n];
        for(int i=n-1;i>=0;i--){
    
    
            dp[i][i] = 1;// i==j时回文串长度为1
            for(int j=i+1;j<n;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][n-1];
    }
}

Supongo que te gusta

Origin blog.csdn.net/qq_43424037/article/details/114230672
Recomendado
Clasificación