4. La más larga secuencia palindrómica ---- Programación Dinámica

Ideas de resolución de problemas:

Estado
subcadena F [i] [j] S representa el i-ésimo a j-ésimo carácter en el carácter, la longitud más larga de la secuencia palindrómica es.

ecuación de transferencia
si el i-ésimo carácter s y la j-ésima mismo carácter, entonces
f [i] [j] = f [i + 1] [j - 1] + 2
Si s i-ésimo carácter y la j-ésima diferente carácter entonces
f [i] [j] = max (f [i + 1] [j], f [i] [j - 1])
y anotar el orden de recorrido, i desde el último carácter que empiece el recorrido hacia adelante, j desde i + 1 comenzó atravesando la parte posterior, por lo que puede asegurarse de que cada sub-preguntas se han considerado bueno.

Inicialización
más larga secuencia palindrómica f [i] [i] = 1 es un único carácter

Resultados
f [0] [n - 1 ]
clase de soluciones {
     pública  int longestPalindromeSubseq (String s) {
         int n = s.length ();
        int [] [] f = nuevo  int [n] [n];
        para ( int i = n - 1; i> = 0; i-- ) { 
            f [i] [i] = 1 ;
            para ( int j = i + 1; j <n; j ++ ) {
                 si (s.charAt (i) == s.charAt (j)) { 
                    f [i] [j] = f [i + 1] [j - 1] + 2 ; 
                } Más {
                    f [i] [j] = Math.max (f [i + 1] [j], f [i] [j - 1 ]); 
                } 
            } 
        } 
        Retorno f [0] [n - 1 ]; 
    } 
}

 

 
clase Solution {
     público  int longestPalindromeSubseq (String S) {
         / * 
            BB AA BB 
            BB BB A 
            DP [i] [j] denota el i-ésimo carácter a la longitud más larga de la secuencia palindrómica entre el j-ésimo carácter 
            1, si s [ i] == cuando s [j], teniendo en cuenta el número de la paridad de la secuencia intermedia i y j, dp [i] [j] = dp [i + 1] [j-1] + 2 
            por encima de DP [i] [j ] = dp [explicación i + 1] [j-1 ] + 2 es: 
            cuando la secuencia es b aa b, i = 0, j = 3, entonces dp [0] [3] = dp [1] [2] + 2 = 4 
            cuando la secuencia es bab, i = 0, j = 2, la dp [0] [2] = dp [1] [1] + 2 = 3 
            cuando la secuencia es bb, i = 0, j = 1, la dp [0] [1] = dp [1] [0] = 0 + 2 = 2 (dp [1] [0] el valor predeterminado es 0) 
            de la ecuación toma en cuenta la paridad  
            2, si s [i ]! = s [j], a continuación, dp [i] [j] = Math.max (dp [i + 1] [j], dp [i] [j-1])
            de la dp por encima de [i] [j] fórmula para explicar: 
            Si la secuencia es dcbcc (index: 0-4) !, S [0] = s [4], la dp [0] [4] = Math.max ( dp [0] [3], dp [1,4]) = Math.max (2,3) = 3 

            Nota: he utilizado de acuerdo con el análisis anterior se coloca en frente de la j i, y escribir hábito aquí como yo i se coloca detrás de la j, es decir, por encima de DP [i] [j] en este documento debe DP [j] [i] 
            dos para bucles, para i de 0 a traverse len-1, y j es i- 1 se decrementa a 0 
            si i = 5, j es entonces del orden de 43.210, lo que resulta en dp [0] [5] el proceso, dp [1] [5] equivalente listo para avanzar con antelación el valor de 
            un solo carácter como una secuencia palindrómica, es decir, DP [I] [I] = 1. 
        * / 

        int len = s.length ();
         int [] [] DP = new new  int [len] [len]; 
       
        para ( int 0 = I; I <len; I ++ ) { 
            DP [I] [I] = 1. ;
            para (  intj = i - 1; j> = 0; j-- ) {
                 si (s.charAt (i) == s.charAt (j)) { 
                    dp [j] [i] = dp [j + 1] [i-1] + 2 ; 
                } Más { 
                    dp [j] [i] = Math.max (dp [j + 1] [i], dp [j] [i-1 ]); 
                } 
            } 
        } 
        Retorno dp [0] [len-1 ]; 
    } 
}

 

Supongo que te gusta

Origin www.cnblogs.com/manmanchanglu/p/12577257.html
Recomendado
Clasificación