¿Por qué chupo la programación (algoritmos de programación dinámica en particular)?

Sea paciente y comience trabajando en problemas más fáciles. Si basa sus quejas únicamente en el hecho de que no puede resolver problemas de programación dinámica, no sea tan duro consigo mismo. Para comprender la programación dinámica, primero debe comprender la recursividad, las optimizaciones básicas (cálculos iterativos, almacenamiento en caché, etc.) y quizás incluso algo de teoría básica de gráficos (DFS, DAG). Para llegar a ese punto, comience por resolver una amplia gama de problemas básicos. Si todavía tiene problemas específicos con la programación dinámica, lea el código de alta calidad y modele sus soluciones a partir de ellos.

Eche un vistazo a Codeforces (consulte el conjunto de problemas para ver si hay problemas más fáciles) o la Capacitación de USACO para practicar. Si pasas 20 horas a la semana durante un año resolviendo estos problemas y aún no entiendes la programación dinámica, entonces, sí, podrías ser un asco en la programación.

Aquí está mi opinión, y sí, es duro. De todos modos, parece que no estás comprometido. Un “programador” no solo “no lo entiende”. Un programador pasa horas y horas y días y días para descubrir algo que no sabe. Así que no se acobarde sino quédese con él y profundice en el material, encuentre ejemplos alternativos para AYUDARLE a comprender. Un programador debe estar dedicado a mejorar su conocimiento al igual que un atleta debe hacer ejercicio todos los días para mantener su cuerpo en forma … o para ponerlo en forma. Sin embargo, si siente que esto es mucho trabajo, haga algo diferente; Hay una gran variedad de alternativas a la programación y una variedad aún mayor de áreas para explorar en un campo de la computadora. ¡No te conformes con algo que no podrás hacer, sino que expande hacia afuera y prueba cosas nuevas!

-La mejor de las suertes para usted, señor; Si esta es tu pasión, no dejes que te deprima tan rápido.

Primero, no solo leas. Conozco a muchos “programadores” que en realidad son personas que solo pagan y copian en exceso. Tome muestras de código y escríbalas a mano. Se sorprenderá de lo cómodo que se sentirá con un idioma una vez que se sienta cómodo escribiendo en él. Sí, mucha programación es pensar y comprender el código. Pero la escritura siempre es crucial.

Segundo, no tengas miedo de pedir ayuda. (Preguntar sobre Quora fue un buen primer paso). Todos necesitamos ayuda, y especialmente comenzar la curva de aprendizaje es increíblemente empinado. No tengas miedo de pedirle ayuda a esos punks de la escuela secundaria (esto viene de un punk de la escuela secundaria a quien le encantaría ayudarte). Haga preguntas, obtenga respuestas, sea increíble.

Por último, soy un asco en la programación también. Por qué, todos apestamos. Simplemente sigue aprendiendo y las cosas se volverán más fáciles, entonces querrás más y pensarás que apestas de todos modos. La programación y la informática son difíciles de dominar. No eres el primer programador en pensar que no están haciendo un trabajo lo suficientemente bueno.

Hombre, ¿qué esperas de un mes? ¿Cuándo eres un novato en algoritmos y aprendes todo eso por ti mismo ?

Antes de dar cualquier consejo práctico, le sugiero que haga las paces con él.
No te compares con los niños de secundaria que ya son capaces de resolver problemas algorítmicos (independientemente del nivel, ACM, Topcoder, etc.). Alcanzar un nivel como ese requiere un largo período de descarga de conceptos en tu cerebro y pasar innumerables horas codificando . Además, la guía de alguien que al menos es capaz de resolver esos problemas por sí mismo. (no es tan esencial si eres muy bueno enseñándote a ti mismo)

Comparto una experiencia similar contigo (y peor). Una vez estudié y viví en una remota escuela secundaria del suroeste de China. Trabajé en programación y algoritmos. Mi maestro solo podía hacer Pascal (sí, lo tienes, no Java ni cosas de C / C ++. ¡Pascal!), Y solo podía resolver problemas muy elementales. (No podía escribir un Dijkstra completo) Bajo su guía, comencé desde cero, y me llevó un año entero tener un nivel básico de Pascal, ni mencionar algoritmos: tuve que aprenderlos todos de unos pocos libros. .

¿Qué tan rápido aprendí? Bueno, para cosas más simples (que se pueden ‘aprender’ recitando el código de un libro de texto) como QuickSort y MergeSort, ¿quizás una semana por algoritmo? ¿Para cosas como la programación dinámica? Un mes para un solo modelo, e incluso ahora todavía no puedo reconocer un patrón DP en un problema solucionable DP.

Así que cálmate, relájate. Aquí vienen algunas sugerencias:

1. Obtenga una cuenta en un sitio de Jueces en línea. (Recomiendo SPOJ, porque admite una larga lista de lenguajes de programación) Busque “programación dinámica SPOJ” y encuentre problemas y sus sugerencias. Intenta trabajar en los más simples.

2. Wikipedia no es una buena fuente cuando buscas materiales para aprender. Hay demasiadas matemáticas (para mí todavía es aterrador). Busque publicaciones de blog, tutoriales, etc. más simples, cualquier cosa que no tenga muchas fórmulas y pruebas.

3. Lo más importante, encuentre a alguien que tenga experiencia en algoritmos y pregúntele cuándo está atrapado en algún concepto o código. Si solo puedo decirte una cosa, esta es la indicada.

Espero que mi respuesta ayude. Había pasado por todo eso, y sé que es realmente un dolor.

Solo tienes que hacer mucha más programación. 19 es muy joven y eres realmente inexperto. Lo siento, pero esa es la verdad. Cuando tenía 19 años había estado programando todos los días desde que tenía 8 años y no sabía nada.

Si tiene dificultades con los problemas de desafío algorítmico, le sugiero que haga algo diferente. Ve y escribe una pieza de software que quieras. La mayor parte de la programación no es terriblemente desafiante desde el punto de vista algorítmico y, cuando encuentras la necesidad de algo no trivial, probablemente te resulte más fácil de abordar que un problema puramente abstracto.

Además, no se preocupe por la programación dinámica. Los escritores de problemas del concurso de programación están obsesionados con la programación dinámica, y la forma en que generalmente se explica lo hace sonar terriblemente complicado. En realidad, muy pocos problemas de programación reales se resuelven mejor pensando en términos de programación dinámica, y la programación dinámica en realidad no es nada especial: es solo una recursión más un caché de resultados previamente calculados. Muchos algoritmos que podría llamar programación dinámica (por ejemplo, encontrar la ruta más corta en un gráfico) no se llaman así porque la solución es solo sentido común.

Cálmese. Probablemente no puedas hablar chino tan bien como un niño chino. Entonces, ¿es chino para ti? No. La diferencia es la familiaridad. ¿Le has preguntado a esos chicos de secundaria cuánto tiempo pasó antes de que pudieran hacer eso? Algunos niños de secundaria podrían haber resuelto cientos de esos problemas antes que tú, así que, por supuesto, son mejores.

Pon un poco de esfuerzo primero, luego queja – diviértete programando

Aprende electrónica. Podrías ser más cinestésico. Programe un Arduino para hacer cosas interesantes que se relacionen con el mundo real.

Alternativamente, descargue VisualPython (VPython), o procesamiento (Processing.org), que le dará retroalimentación visual / geométrica a su codificación estrictamente lógica / simbólica.

Lo mismo me sucedió cuando estaba en la escuela secundaria. Me tomó aproximadamente 2 años sentir la “esencia” de resolver problemas de DP. No sé si ayuda, pero esta es la forma en que uso para resolver problemas básicos de DP:

Dentro de cada ciclo, imagine que se debe usar el último (el que le da la respuesta final al problema). Luego examine la relación entre esa elección fija y sus posibles elecciones anteriores imaginando que todas ellas tienen las mejores respuestas.

Elaboraré un ejemplo más adelante si alguien está interesado.