Como se publicó en los comentarios de las preguntas, puede leer la solución y su implementación de C ++ en los foros de TopCoder. Solo estoy proporcionando una idea de muy alto nivel. Este problema se puede resolver con la programación dinámica.
Deje que [math] dp [i] [j] [/ math] denote el número de subsecuencias crecientes de [math] A [/ math] con una longitud [math] j [/ math] cuyo último elemento es [math] A [i ][/matemáticas]. Podemos dividir todas esas secuencias en función del índice del segundo último elemento de la subsecuencia. Si el segundo último índice es [matemática] k [/ matemática] entonces [matemática] k <i [/ matemática] y [matemática] A [k] <A [i] [/ matemática]. Además, la subsecuencia sin su último elemento es de la longitud [matemática] j – 1 [/ matemática] y termina en [matemática] A [k] [/ matemática]. Entonces, poniéndolo en una relación de recurrencia, obtenemos:
[matemáticas] dp [i] [j] = [/ matemáticas] [matemáticas] \ sum_ {k <i} (dp [k] [j-1] \ text {if} A [k] <A [i] \ texto {else} 0) [/ math]
- ¿Cuál es el mejor método para verificar si un árbol binario es un árbol de búsqueda binario?
- ¿Cómo debo prepararme para las entrevistas FSAE o BAJA?
- Durante una entrevista, ¿cómo respondería a la pregunta "describa lo que sabe sobre el aprendizaje automático"?
- ¿Hay algún instituto que lo capacite para descifrar entrevistas tecnológicas difíciles como Google / Amazon / Microsoft?
- ¿Cuál según usted debería ser una buena manera de contratar programadores?
con los casos base:
[matemáticas] dp [i] [0] = 1 [/ matemáticas]
Esto puede dar inmediatamente una solución [matemática] O (N ^ 2K) [/ matemática] si queremos encontrar el número de subsecuencias de longitud [matemática] k [/ matemática] para todas las [matemática] k \ le K [/ matemática ] Con algunas estructuras de datos, el factor [math] O (N ^ 2) [/ math] puede reducirse a [math] O (N log (N)) [/ math].