1 // 2 // Creado por snnnow en 2020/4/13. 3 // 4 // Este es el problema básico del problema dp 5 // 6 // El más largo no cae 7 // (La intercepción de misiles es su ejemplo) 8 // Entonces, de qué trata este artículo, 9 // Principalmente, esta pregunta usa una matriz bidimensional, 10 // Y el misil usó tres matrices unidimensionales en el momento 11 // De hecho, es esencialmente lo mismo 12 // (¡Hay una estructura para hacerlo! QAQ [Cabeza de perro manual]) 13 14 // No hay mucho que decir, ans [i] [1] es el número original 15 // ans [i] [2] es el elemento El más largo 16 // ans [i] [3] apunta al siguiente (la posición del siguiente valor) 17 //Empezar! 18 #include <iostream> 19 usando namespace std; 20 int main () { 21 int ans [ 10010 ] [ 10 ]; // Aunque solo necesitamos tres números en la segunda dimensión, es mejor abrir un 22 int n más grande ; 23 cin >> n; 24 para ( int i = 1 ; i <= n; ++ i) { 25 cin >> ans [i] [ 1 ]; 26 ans [i] [ 2 ] = 1 ; 27 ans [ i] [ 3 ] =0 ; 28 29 } 30 para ( int j = n- 1 ; j> = 1 ; -j) { 31 int k = 0 ; // Tenga en cuenta que k y p se actualizan cada vez que i, por lo que debe Ponga en este bucle aquí 32 int p = 0 ; 33 for ( int i = j + 1 ; i <= n; ++ i) { 34 35 if (ans [j] [ 1 ]> = ans [i] [ 1 ] && ans [j] [ 2 ]> k) { // k registra los 36 k más grandes de todos ans [j] [2] = ans [j] [2 ]; 37 38 p = j; 39 } 40 if (k> 0 ) { 41 ans [i] [ 3 ] = p; // p es un "puntero", ans [j] [3] almacena un Posición 42 ans [i] [ 2 ] = k + 1 ; 43 } 44 45 } 46 47 } 48 // Compare ans [i] [2] uno por uno para encontrar el más grande, preste atención para encontrar una variable y márquelo 49 int marca = 1 ; 50 para ( int i =1 ; i <= n; i ++ ) { 51 if (ans [i] [ 2 ]> = ans [mark] [ 2 ]) { 52 mark = i; // Esto no es una ordenación, no se necesita un bucle doble, solo busque una comparación con lo que ha sido en la línea 53 es } 54 es } 55 COUT << ANS [marca] [ 2 ] << endl; 56 es el tiempo (! Marcos = 0 ) { 57 es COUT << " " << ANS [marca] [ 1. ]; 58 marca = ans [marca] [ 3 ]; 59 } 60 devuelve 0 ; 61 }
Esta vez, el primer bucle de orden inverso -j se escribe como ++ j. . Directamente frito
Luego escriba la definición de k en el lugar equivocado (k se actualiza con cada ans [i])
¡Demasiado tonto, Xiaobai continuará animando!