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 !