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:
- ¿Cuál es el algoritmo de aprendizaje de Quora para su suministro de noticias?
- ¿Cuál es la conclusión del algoritmo de Dijkstra?
- ¿Es posible desarrollar un algoritmo que pueda hacer predicciones perfectas en el mercado de valores?
- ¿Cuándo es conveniente resolver un problema usando un algoritmo codicioso?
- Cómo ordenar la matriz de una estructura utilizando solo uno de sus miembros de datos en c ++ (STL)
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!