(Programación dinámica) subcolumna de mayor aumento

Primero mira el problema,

La subcolumna de mayor crecimiento.

Es decir, saque n números en orden en la matriz, (en el orden original) la secuencia de subnúmeros es una secuencia creciente.

Por ejemplo: el resultado final de la secuencia 1 2 3 -1 es 3. La secuencia más correspondiente es obviamente 1 2 3

(Tenga en cuenta que solo se emite la longitud).

Por supuesto, si aún necesita modificar el algoritmo ligeramente de acuerdo con las coordenadas,

Aquí es principalmente para entender las ideas

   Sin más preámbulos, comencemos a explicar la idea general (programación dinámica)

   Para los primeros n números de la matriz, que es el primero, el segundo enésimo, respectivamente, encuentre la subsecuencia en aumento continuo más larga que termina en el primero, segundo y enésimo. Luego, cuando ingresamos el enésimo Para los números +1, solo necesitamos comparar hacia adelante, encontrar el número más pequeño que el n + 1 ° bit y registrarlo como el bit X. Dado que hemos obtenido la longitud de la subsecuencia de mayor crecimiento continuo que termina con el X ° bit (registro Do Y) Entonces, nuestra subsecuencia de mayor crecimiento continuo que termina en n + 1 bits es Y + 1

Comparamos secuencialmente hacia adelante, el registro es menor que n + 1 y el valor máximo de la longitud correspondiente se puede aumentar en uno

Por lo tanto, sabemos el final del recorrido desde el primer bit, y podemos obtener la longitud de la subsecuencia en aumento continuo más larga que termina con cada bit. Para que podamos obtener el resultado

Por supuesto, también puede obtener la secuencia correspondiente. Los pasos para obtener la secuencia no son específicos aquí.

A continuación miramos el código específico

 

 

#include <stdio.h> int Max ( int a [] [ 2 ], int n, int cont) // 寻找{
     int i;
    int max = 0 ;
    para (i = n- 1 ; i> = 0 ; i-- ) {
         if (a [i] [ 0 ] < cont) {
             if (a [i] [ 1 ]> max) { 
                max = a [i] [ 1 ]; 
            } 
        } 
    } return max; 
}



    
    
    
int main ( int argc, const  char * argv []) {
     // inserte el código aquí ... 
    int n; 
    scanf ( " % d " , & n);
    int n1 [n] [ 2 ];
    int i;
    int max = 1 ;
    para (i = 0 ; i <n; i ++ ) { 
        scanf ( " % d " , & n1 [i] [ 0 ]); 
        n1 [i] [ 1 ] = Máx. (n1, i, n1 [i] [ 0 ]) + 1 ; //Ingrese y encuentre la asignación 
        if (n1 [i] [ 1 ]> max) { 
            max = n1 [i] [ 1 ]; 
        } 
        
    } 
    int n2 [max]; // Almacenar sub-columna 
        printf ( " % d \ n " , max ); // Longitud de salida 
    int m = max; // Registro max 
    para (i = n- 1 ; i> = 0 ; i-- ) {
         if (n1 [i] [ 1 ] == max) { 
            n2 [max - . 1 ] = N1 [I] [ 0 ]; 
               max -; 
        } 
    } 
    para (i = 0 ; i <m; i ++) // 输出
    { 
        printf ( " % d " , n2 [i]); 
    } 
    printf ( " \ n " );
    devuelve  0 ; 
}

 

 

 

 

Este es el gráfico de salida de prueba

 

Aquí también está escrito el código para generar la secuencia específica, puede estudiarlo usted mismo

  Si hay algo mal o algo que no comprende bien, deje un comentario en el área de comentarios   

Gracias !

Supongo que te gusta

Origin www.cnblogs.com/cndccm/p/12207796.html
Recomendado
Clasificación