dp secuencia no decreciente más larga

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!

Supongo que te gusta

Origin www.cnblogs.com/zhmlzhml/p/12693160.html
Recomendado
Clasificación