Cómo resolver un problema de programación difícil por mi cuenta

Escribí sobre la forma en que me gusta progresar a través de problemas de programación más difíciles aquí: la respuesta de Cameron Reynoldson a ¿Cuál es la mejor manera de avanzar a través de problemas de práctica en CodeChef, SPOJ, TopCoder, etc.?

TL; DR, luche antes de buscar otros recursos. Aprende a aprender. Con eso quiero decir, aprende a depurar tu código, aprende a escribir código de trabajo en el primer intento (resuelve muchos problemas fáciles realmente rápido y te volverás bueno a esta velocidad) y aprende cómo aplicar las técnicas que has aprendido en otros problemas al problema actual.

Aquí está mi proceso de pensamiento para nuevos problemas que parecen interesantes / desafiantes:

1. ¿Qué tipo de problema es? ¿Se trata de gráficos? Árboles? ¿Programación dinámica? ¿Recursión con pequeña entrada? La mejor manera de ser bueno para reconocer la categoría de un problema es simplemente resolviendo más problemas. Confía en mí, no estoy cerca de donde quiero estar y estoy continuamente resolviendo problemas para tratar de llegar allí. Es algo que tendrá que hacer, pero afortunadamente el proceso me parece agradable. Hay muchos trucos interesantes que encontrará en el camino que podrían aplicarse a docenas de problemas.

2. Bien, sé el tipo, ¿y ahora qué? Ahora piense en todos los problemas pasados ​​que ha resuelto así y descubra cómo estructurar el problema actual. Si es recursivo, ¿cuál es su caso base? Si es DP, ¿cuál es la subestructura superpuesta? ¿Cómo estructurará la matriz / tabla DP? Si se trata de gráficos, ¿hay algún algoritmo gráfico que conozca o una relación entre nodos que sepa que podría aplicarse a esto? Si tienes suerte, darás muchos pasos y resolverás problemas relativamente rápido. Sin embargo, no siempre es así.

3. Conozco el tipo de problema, pero nunca antes había visto algo tan malvado. ¿Ahora que? Saca el lápiz y el papel y resuelve el problema a mano. Sip. Pasar por el proceso mentalmente, a mano, generalmente revela una solución de trabajo. A veces me olvido de hacer esto, pero es muy útil. Hacerlo puede ayudarlo a identificar relaciones de recurrencia, patrones en la estructura, o tal vez revelar un truco inteligente que nunca pensó que podría usar en este tipo de entorno 😛

Si ninguno de estos funciona y todavía está atascado, repita el proceso para asegurarse de que no pueda resolverlo. Una vez que te hayas asegurado de eso, busca una pista y repite el proceso. Ahora repita ESE proceso hasta que aún no pueda resolverlo. Una vez que llegue a ese punto, mire la solución y aprenda de ella para que nunca tenga que preocuparse por ese problema nuevamente y para que pueda eliminar cualquier otro problema en la misma categoría y detectar esos problemas en el paso 2 🙂

¡Esto fue más largo de lo previsto, pero espero que ayude un poco!

¡Feliz resolución de problemas!