Comenzando con el deporte de la programación
Este documento es para guiar a aquellas personas que desean comenzar o que acaban de comenzar con una programación competitiva.
Originalmente, este documento fue preparado durante los veranos de 2014 para ayudar a los estudiantes de primer año del Instituto Indio de Tecnología, Kanpur. Entonces, pensamos que podría ser útil para otros también.
Requisito previo: Conceptos básicos de cualquier lenguaje de programación. Seguiremos C / C ++.
Nota : Tenga en cuenta que este blog no pretende explicar conceptos en detalle. El objetivo de este blog es guiarlo sobre qué temas debe leer y practicar de manera sistemática. Sin embargo, en muchos lugares se han incluido explicaciones breves por su relevancia. Los problemas relevantes se dan después de cada tema. Se proporcionan fuentes adecuadas desde donde se pueden estudiar estos conceptos. Cuando no se mencionan las fuentes, eso significa que son muy muy populares y puede conocerlas con solo una búsqueda en Google. ¡Avanza y disfrútalo!
- ¿Qué libros, sitios web o documentales recomiendas para aprender sobre la historia africana precolonial?
- ¿Cuáles son los mejores canales o sitios web de YouTube que me pueden enseñar los límites, la continuidad y la trigonometría de la manera más fácil?
- JavaScript (lenguaje de programación): ¿desde qué sitio puedo aprender JavaScript de la mejor manera?
- ¿Qué sitios web visitan con frecuencia los fotógrafos profesionales?
- ¿Cuál es una buena alternativa a ZeroHedge?
Todas las siguientes cosas son de nuestra experiencia y no algo escrito en piedra.
- Necesitarás mostrar motivación.
- Idiomas que deberían usarse
- C / C ++ / JAVA (su elección)
- Nos centraremos en C ++, JAVA es lento (una gran ventaja de JAVA es Big Integers, veremos más adelante)
- C ++ es como un superconjunto de C con algunas herramientas adicionales. Entonces, básicamente, si tiene conocimiento de C, también está listo para codificar en C ++. De lo contrario, regrese y aprenda a escribir códigos en C / C ++
- A veces, el conocimiento de PYTHON es útil cuando realmente necesita números enteros grandes.
PARTICIPA PARTICIPA PARTICIPA (el único mantra)
- SPOJ: es un archivo problemático (recomendado para todos los principiantes
- Comience con problemas para tener envíos máximos. Resuelva los primeros problemas (puede ser 20). Desarrolla un poco de confianza. Luego comience a seguir algunos buenos codificadores (verifique sus presentaciones iniciales). Luego comience a resolver problemas con un tema sabio
- Nunca se quede atascado durante demasiado tiempo en el período inicial. Busca en Google tus dudas e intenta resolverlas o puedes hablar con alguien (SOLO AL PRINCIPIO).
- Antes de participar en concursos en vivo como codeforces o codechef, asegúrese de haber resuelto unos 50-70 problemas en SPOJ.
- CODECHEF: Haz los tres concursos cada mes. Participe en CodeChef LunchTime con seguridad.
- Incluso si no puede resolver un problema, siempre mire los editoriales y luego codifíquelo para que lo acepten (esta es la forma en que aprenderá).
- E incluso si puede hacerlo, mire los códigos de algunos buenos programadores. Vea cómo se han implementado. De nuevo aprenderás.
- El mismo punto se aplica también a TopCoder y Codeforces.
- Codeforces: 4 a 5 concursos cortos de 2 horas en un mes (Hazlos una vez que desarrolles algo de confianza).
- TopCoder: una vez que tenga la experiencia adecuada y pueda escribir códigos muy rápido.
Concursos de programación en línea:
Escribes códigos y los envías en línea. El juez ejecuta su código y verifica la salida de su programa en busca de varias entradas y le da el resultado en función de las salidas de su programa. Debe seguir los formatos exactos de E / S. Por ejemplo, no imprima declaraciones como: “ingrese un número”, etc. 😛
Cada problema tiene restricciones:
Analice adecuadamente las restricciones antes de comenzar a codificar.
- Límite de tiempo en segundos (le da una idea de cuál es el orden de solución que espera) -> análisis de orden (discutido más adelante) .
- Las restricciones de entrada (muy imp): la mayoría de las veces puede adivinar correctamente el orden de la solución analizando las restricciones de entrada y el límite de tiempo.
- Límite de memoria (no necesita molestarse a menos que esté usando una cantidad increíblemente grande de memoria).
Tipos de errores que puede encontrar aparte de la respuesta incorrecta:
- Error de tiempo de ejecución (más encontrado)
- Falla de segmentación (acceso a una dirección de memoria ilegal)
- Usted declaró una matriz de un tamaño menor al requerido o está intentando acceder a índices negativos.
- Declaración de una matriz de ENORME ENORME (más de 10 ^ 8 pulgadas) tamaño -_-.
- Dividiendo por cero / Tomando módulo con cero: O.
- USE gdb (aprenderá en las próximas conferencias)
- error de compilación
- Necesita aprender a codificar en C ++.
- UTILICE el compilador GNU G ++ o IDEONE (tenga cuidado de hacer los códigos privados).
- Límite de tiempo excedido (TLE)
- Su programa no pudo generar toda la salida dentro del límite de tiempo dado.
- Los archivos de entrada no se generan aleatoriamente, se crean de manera tal que no pase código incorrecto.
- Siempre piense en los peores casos antes de comenzar a codificar. Siempre trate de evitar TLE.
- A veces se requieren algunas pequeñas optimizaciones y, a veces, realmente necesita un algoritmo totalmente nuevo y eficiente (esto lo aprenderá con el tiempo).
- Entonces, cuando tenga dudas de que su código pasará o no, la mayoría de las veces no pasará.
- Nuevamente haga un análisis de orden adecuado de su solución.
A veces cuando estás atrapado. Verifique el tiempo de ejecución de otros códigos aceptados para tener una idea como qué Orden de solución están escribiendo otras personas / qué cantidad de memoria están usando.
Matriz de 4 MB ~ de tamaño 10 ^ 6. O matriz 2-d de tamaño 10 ^ 3 * 10 ^ 3
Los límites de memoria estándar son del orden de 256 MB
Análisis de orden:
El orden de un programa es una función que depende del algoritmo que codifique. No entraremos en detalles teóricos, solo piense en el orden del programa como el número total de pasos que el programa tomará para generar resultados, generalmente una función basada en entradas como O (n ^ 2) O (n) O (log n).
Supongamos que escribe un programa para agregar números N. Vea el siguiente código.
int cur, suma = 0;
para (int i = 0; i <n; ++ i)
{
scanf (“% d”, & curr);
sum = sum + curr;
}
Número total de cálculos = n * (1 + 1 + 1 + 1)
n veces comprobando i
n veces i ++
n veces scanf
n veces + operando
Entonces total de 4 * N.
Eliminamos la constante y la llamamos O (N)
Esto es lo más simple que puedo explicar. Obtendrá una mayor comprensión con la práctica y el aprendizaje.
Debe conocer el tiempo de ejecución de estos algoritmos (DEBE)
Búsqueda binaria ->?
Fusionar / Ordenar rápido ->?
Buscando un elemento en una matriz ordenada / no ordenada ->?
HCF / LCM / Factorización / Prime CHeck?
Todos sabemos que la potencia de cálculo de un procesador también es limitada.
Suponga 1 segundo ~ 10 ^ 8 operaciones por segundo. (para el antiguo servidor spoj es 4 * 10 ^ 6).
Tenga esto en cuenta al resolver cualquier problema.
Si su programa toma O (n ^ 2) pasos y problemas tiene T casos de prueba. Entonces el orden total es T * N ^ 2.
Para T <100 y N <1000. Pasara .
Pero para T <1000 y N <1000 no lo hará.
Tampoco para T <10 y N <10000
DESBORDAMIENTO INT:
Suma tres números.
Restricciones:
0 <a, b, c <10 ^ 9
int main ()
{
int a, b, c;
scanf (“% d% d% d”, & a, & b, & c);
int ans = a + b + c;
printf (“% d”, ans);
devuelve 0;
}
Este programa no proporcionará la salida correcta para todos los casos, ya que 3 * 10 ^ 9 no se puede almacenar en INTS, necesita int largo o int sin signo (4 * 10 ^ 9).
que pasa si 0
Comparación de dobles:
int main ()
{
flotador a;
scanf (“% f”, & a);
if (a == 10) printf (“SÍ”);
devuelve 0;
}
flotante / doble no tiene precisión infinita. CUIDADO (precisión de 6/15 dígitos para ellos respectivamente)
Prueba el siguiente problema.
SPOJ.com – JUEGOS DE PROBLEMAS
Biblioteca de plantillas estándar (STL):
En su código, a veces necesita algunas estructuras de datos ( DS ) y algunas funciones que se usan con bastante frecuencia. Ya tienen muchas funciones estándar y estructuras de datos implementadas dentro de sí mismo que podemos usar directamente.
- Estructuras de datos (para ser discutido en conferencias posteriores)
- Vectores
- Apilar
- Cola
- Cola prioritaria
- Conjunto
- Mapa
- Las funciones
- Ordenar
- Marcha atrás
- GCD
- Intercambiar
- next_permutation
- binary_search (izquierda + derecha)
- máximo minimo
- pow, powl
- memset
Ahora imagine escribir códigos usando estas funciones y estructuras de datos incorporadas. Sería mucho más simple ahora.
¿Qué encabezados / bibliotecas debe incluir?
Básicamente, las funciones / DS anteriores están en diferentes bibliotecas. Entonces, en algunos casos, es posible que deba incluir muchos encabezados. Pero puede incluir todo usando solo un encabezado.
#include
Pruebe el siguiente problema:
Subidas y bajadas
¿Cuál de las funciones incorporadas anteriores usaste?
¿Qué sucede si necesita ordenar una matriz de estructura?
Puede hacer una estructura y escribir una función de comparación (lea más en www.cplusplus.com) O puede usar un vector de pares.
Lee esto:
Tutoriales de algoritmos
Ahora está listo para comenzar una programación competitiva.
Puedes seguir leyendo este documento o comenzar por tu cuenta. Buena suerte 🙂
Primero, debes aprender los algoritmos básicos y bien conocidos. No solo el algoritmo, sino que también debe comprender por qué funciona, probarlo, codificarlo y analizarlo. Para saber qué algoritmos básicos debes saber puedes leer:
- ¿Qué se necesita para convertirse en un buen algoritmo como los mejores clasificados en Topcoder / Spoj / GCJ?
- ¿Cuáles son los 10 algoritmos que uno debe conocer para resolver la mayoría de los problemas de algoritmos?
- ¿Qué algoritmos y estructuras de datos debe conocer cualquier ingeniero de software?
Lea también estas respuestas sobre cómo iniciar una programación competitiva y ser bueno en eso.
- Para un principiante de ACM-ICPC, ¿cómo debo comenzar?
- ¿Puedo descifrar el ACM-ICPC en 1,5 años si tengo que empezar desde cero?
- ¿Cuál fue la estrategia de programación competitiva de Anudeep Nekkanti para convertirse en el puesto 35 en el ranking mundial, en solo 6-7 meses?
TopCoder tiene muy buenos tutoriales sobre algunos temas, léalos aquí.
También puede leer este tema del libro para entender un algoritmo de manera más profunda http://ldc.usb.ve/~xiomara/ci2525/ALG_3rd.pdf .
Para ser bueno escribiendo códigos rápidos y mejorando su implementación, puede seguir esto:
Mi consejo personal es comenzar a practicar en TopCoder. Comience con Div2 250 master, luego comience con Div2 500 master, luego pase a Div1 250. Lea también los editoriales del problema que resuelve y los códigos de envíos más rápidos para aprender cómo implementar códigos de manera simple y elegante. Mientras tanto, siga aprendiendo algoritmos y sigue practicándolos en SPOJ o CodeChef o Codeforces. Y lea los tutoriales, después de un tiempo se dará cuenta de que los trucos y métodos para resolver se repiten. Aprendemos solo de la práctica. Si lees lo mismo 5 veces en diferentes tutoriales, entonces no se almacenará correctamente en tu memoria a corto plazo.
A continuación hay algunos temas para comenzar y problemas relacionados con ese tema.
Son cosas muy básicas y puedes aprender todo lo que necesitas saber simplemente buscándolas en Google.
“Cuando tenga algo de tiempo, intentaré actualizar y dar más detalles sobre los temas que un novato debería cubrir”.
Intenta resolver todos los problemas que se detallan a continuación si eres un principiante.
PRIMES
- Prime Check (O (log n) también es posible leer sobre miller-rabbin)
- Factorización
- Numero de factores
- Suma de factores
- Generando Primes usando tamiz de eratóstenes
- Límites en número de primos hasta N
- La función totient de Euler
- Problemas de práctica:
- SPOJ.com – Problema NDIV
- Problema – 431B – Fuerzas de código
- SPOJ.com – JUEGOS DE PROBLEMAS
- SPOJ.com – Problema GCJ101BB
- SPOJ.com – Problema GCJ1C09A
- SPOJ.com – Problema PRINCIPAL72
- SPOJ.com – Problema WINDVANE
- SPOJ.com – Problema NDIV
- SPOJ.com – Problema PTIME
- SPOJ.com – Problema NDIVPHI
- SPOJ.com – Problema NOSQ
- SPOJ.com – Problema AFS
- Witua y Matemáticas
- SPOJ.com – Problema CUBEFR
- Prueba tantos como puedas.
- Otras cosas que puedes leer mientras tanto
- Función de Totient de Euler y teorema de Euler [[LEER]]
- Función de módulo y sus propiedades
- Algoritmo de Miller-Rabin [[LEER]]
- Algoritmo de Euclides extendido [[LEER]]
- Sigue explorando STL
- Probar que el tiempo de ejecución de HCF es O (log n)
- Intenta ordenar estructuras
- Practique algunos problemas con varios jueces en línea.
- Intente hacer operaciones + – * en números grandes (<1000 dígitos) utilizando la matriz de caracteres (para la implementación de aprendizaje)
- Número de factores y suma de factores en tiempo sqrt (n), Número de primos hasta N
Teoría básica de números
- Operaciones de módulo y módulo inverso
- Cómo calcular a ^ b% p en O (log b), donde p es primo
- Encuentre el enésimo módulo de número de Fibonacci p [Lea la matriz exponencial]
- ¡norte! % p (¿y si tenemos muchos casos de prueba?)
- ETF (cálculo / cálculo con tamiz)
- Teorema de Euler, pequeño teorema de Fermat, teorema de Wilson [[LEER]]
- nCr% p (módulo inverso) (lea sobre el algoritmo euclid extendido)
- (p-1)! % p para prime p, Uso del teorema de fermat en Miller-Rabin (Probabilistic) ( Registros de bases de SPRP Miller-Rabin )
- 64 Elija 32 <10 ^ 19 podemos precalcular hasta aquí una matriz de 2 dimensiones [Aprenda el uso de la relación recursiva: (n + 1) Cr = nCr + nC (r-1)]
- Número de formas de atravesar en matriz 2D [Número catalán] (¿y si algunos lugares están bloqueados? Sugerencia: DP)
- a ^ b% c. Dado Hcf (a, c) = 1. ¡Y qué pasa si Hcf (a, c)! = 1. [[LEER Teorema del resto chino, no se usa mucho en la competencia]]
- Matriz de exponenciación
- Resolver la recurrencia lineal utilizando la exponenciación matricial (como Fibonacci)
- Problemas de práctica:
- http://www.spoj.com/problems/DCEPC11B
- Viaje de estudios
- SPOJ.com – Problema FIBOSUM
- SPOJ.com – Problema POWPOW
- SPOJ.com – Problema POWPOW2 [[CRT]]
- Siga estos tutoriales (los problemas enumerados pueden ser difíciles, pero lea el tutorial)
- Tutoriales de algoritmos
- Tutoriales de algoritmos
- Tutoriales de algoritmos
- Tutoriales de algoritmos
Poder de BITS
- Los números se almacenan como bits binarios en la memoria, por lo que la manipulación de bits es siempre más rápida.
- Operador ‘o’ bit a bit: |
- Operador bit a bit ‘y’: &
- Operador ‘xor’ bit a bit: ^
- Bitwise ‘desplazamiento a la izquierda’: <<
- Bitwise ‘desplazamiento a la derecha’: >>
- Memset y sus usos usando la función: sizeof ()
- Bitmask y uso de Bitmask en programación dinámica [[subconjunto DP]]
- Algunos trucos geniales
- n = n * 2 :: n = n << 1
- n = n / 2 :: n = n >> 1
- comprobando si n es una potencia de 2 (1,2,4,8 …) :: comprobando (n & (n-1))
- si x es la potencia máxima de 2 dividiendo n, entonces x = (n & -n)
- Número total de bits que se establecen en n = __builtin_popcount (n)
- establecer el enésimo bit de n :: n | = (1 << x)
- comprobando si el bit x de n está configurado :: comprobando si n & (1 << x) no es cero
- Problema: se le dan N números y un número S. Verifique si existe algún subconjunto de los números dados que sume igual a S. ¿Qué sucede si se le pide que calcule el número de dichos subconjuntos?
- Problemas de práctica:
- SPOJ.com – Problema SPCO
- Problema – 114B – Fuerzas de código
- Más se agregará más tarde
- Lea esto para mayor conocimiento
- Tutoriales de algoritmos
Búsqueda binaria
- Pruebe esto: Problema – 431D – Fuerzas de código
- Comprender el concepto de búsqueda binaria. Tanto left_binary_search como right_binary_search. Intenta implementarlo por tu cuenta. Mira la implementación de otros.
- implementación de muestra:
int l = 0, r = 10000, key_val = SOME_VALUE, m;
mientras que (r – l> 1)
{
m = (l + r) >> 1;
int val = some_non_decreasing_function (m);
if (val <key_val) l = m;
de lo contrario r = m;
}
if (some_non_decreasing_function (l) == key_val) devuelve l;
de lo contrario regrese r;
// esto se puede modificar de varias formas, según se requiera en el problema
- Problemas de práctica:
- SPOJ.com – Problema AGGRCOW
- Problema – 431D – Codeforces [[¿No aprendiste algo nuevo?]]
- SPOJ.com – Problema PIE
- SPOJ.com – Problema TETRA
- SPOJ.com – Problema KOPC12A
La belleza de la biblioteca de plantillas estándar de C ++
- Vectores en una dimensión y dos dimensiones
- http://www.codechef.com/MAY14/problems/CHEFBM
- resolver: compiladores y analizadores
Ahora usa pilas para saborear su belleza y resolver también el siguiente problema.
Problema – 344D – Fuerzas de código - Cola
- SPOJ.com – Problema DONALDO
- Cola prioritaria
- Problema – I – Fuerzas de código [[Primer intento sin usar la cola de prioridad]]
- Conjunto
- SPOJ.com – Problema FACEFRND [[Primer intento sin usar set]]
- ¿Qué sucede si le digo que, aparte de escanear la entrada, este problema se puede hacer en 2 líneas? Interesante? ¡Pensar!
- Mapa
- Traducciones Turísticas
- Problema – C – Fuerzas de código
Algunos Problemas de práctica antes de continuar
- SPOJ.com – Problema DCEPC11B
- http://www.spoj.com/problems/AGGRCOW/
- http://www.codechef.com/problems/CHEFBM
- Solo algunas permutaciones 3
- SPOJ.com – Problema KOPC12A (recomendado)
- Witua y Matemáticas / (recomendado)
- Problema – 431D – Fuerzas de código (recomendado)
- http://www.spoj.com/problems/SPCO/
- SPOJ.com – Problema FIBOSUM
- http://www.spoj.com/problems/POWPOW/ (recomendado)
- El número de soluciones
- SPOJ.com – Problema IOPC_14F
- http://www.spoj.com/problems/NDIVPHI/ (recomendado)
- http://www.spoj.com/problems/AU12/ (fácil)
- http://www.spoj.com/problems/ETF/ (fácil)
- Problema – 114B – Fuerzas de código (fácil)
- SPOJ.com – Problema HISTOGRA [[Sugerencia: use pilas]]
- SPOJ.com – Problema HOMO
- SPOJ.com – Problema NGM2
GRÁFICOS
- Pruebe los siguientes problemas:
- Camino principal
- Prayatna PR
Algunas ideas ?
- Def: Piense en los gráficos como una relación entre los nodos, los nodos relacionados están conectados a través de edge
- ¿Cómo almacenar un gráfico? (complejidad espacial)
- Matriz de adyacencia (útil en gráfico denso)
- Lista de adyacencia (útil en gráfico escaso) O (min (deg (v), deg (u)))
- Debe conocer las siguientes terminologías con respecto a los gráficos:
- Vecinos
- Nodo
- Borde
- Grado de vértices
- Gráfico dirigido
- Gráfico conectado
- Gráfico no dirigido
- Componentes conectados
- Puntos de articulación
- Puentes de articulación
- Árbol [[gráfico conectado con N nodos y bordes N-1]]
- Hojas
- Niños
- Padre
- Antepasado
- Árbol enraizado
- Árbol binario
- Árbol K-ary
- Ciclo en gráfico
- Camino
- Caminar
- Gráfico acíclico dirigido [[DAG]]
- Clasificación topológica (no muy importante, en mi opinión)
- Gráfico bipartito (el árbol es un ejemplo de gráfico bipartito. Interesante, ¿no?)
- Breadth First Search / Traversal ( BFS ) [[muy importante, domínelo lo antes posible]]
- Aplicación: ruta más corta en gráficos no ponderados
- Profundidad de la primera búsqueda / recorrido ( DFS ) [[muy muy importante, domínelo lo antes posible]]
- Infinitamente muchas aplicaciones, es broma 😛 (¡Pero es verdad, de hecho!)
- ¡Ahora prueba los problemas dados al principio!
- Problemas de práctica:
- Página en codechef.com
- SPOJ.com – Problema PRATA
- SPOJ.com – Problema ONEZERO
- SPOJ.com – Problema PPATH
- SPOJ.com – Problema PARADOX
- SPOJ.com – HERDING de problemas
- SPOJ.com – Problema PT07Z
- SPOJ.com – Problema NICEBTRE
- SPOJ.com – Problema CERC07K
- SPOJ.com – Problema BUGLIFE
- SPOJ.com – Problema COMCB
- SPOJ.com – Problema NAKANJ
- Llámeme si quiere
- Una relación sobre los números
- http://www.codechef.com/IOPC2013/problems/IOPC13C
- Problema: se le da un gráfico. Encuentra el número de componentes conectados en el gráfico.
- Sugerencia: DFS o BFS.
- Problema: se le proporciona una cuadrícula con pocas celdas bloqueadas y otras abiertas. Se le da una celda, la llamada es fuente , y otra celda, llámela dest . Puede moverse de una celda u a otra celda v si la celda v está abierta y está adyacente a la celda u. Tienes que encontrar la ruta más corta desde el origen hasta el destino .
- Sugerencia: Intente pensar en la cuadrícula como un Gráfico y aplique un algoritmo de ruta más corto. Cúal ? Crees !
- Problema: Te dan un árbol. Necesitas encontrar dos vértices u y v tal que la distancia entre ellos sea máxima.
- Sugerencia: ¡Intente hacerlo en O (1) número de DFS o BFS!
ALGORITMOS DE GREEDY
Los algoritmos codiciosos son uno de los algoritmos más intuitivos. Cada vez que vemos un problema, primero intentamos aplicar una estrategia codiciosa para obtener la respuesta (los humanos somos codiciosos, ¿no es así?).
Lea este tutorial para obtener más información o puede intentar directamente los problemas, la mayoría de los enfoques ambiciosos son bastante simples y fáciles de entender / formular, pero muchas veces la parte de prueba puede ser difícil. Pero siempre debe intentar demostrar su enfoque codicioso porque la mayoría de las veces sucede que luego se da cuenta de que su solución no da la respuesta óptima.
Tutoriales de algoritmos
Generalmente se usan en problemas de optimización y existe una subestructura óptima para el problema y las soluciones son generalmente O (n log n) (clasificación) u O (n) (paso único).
Lista de problemas
- SPOJ.com – Problema BAISED
- SPOJ.com – Problema BALIFE
- SPOJ.com – Problema GCJ101BB
- Buen provecho
- Problema de mochila
- Pequeño elefante y música
- SPOJ.com – ARREGLO DE PROBLEMAS
- SPOJ.com – Problema MODA
P) Un ladrón irrumpe en una tienda y descubre que hay N artículos de peso del artículo es Wi y el costo de este artículo es Ci y el ladrón tiene una bolsa que puede llevar a la mayoría de las W unidades de peso. Obviamente el ladrón quiere tener el máximo beneficio. Qué estrategia debería elegir si:
Caso 1: si se le permite tomar parte fraccionaria de los artículos (como asumir que el artículo es una bolsa de arroz y usted puede tomar la fracción de arroz que desee). [Sugerencia :: codicioso])
Caso 2: si no puede romper los elementos en partes fraccionarias. ¿Será ahora un trabajo codicioso? Intenta hacer algunos casos de prueba para los que la codicia fallará.
La mayoría de las veces, cuando el codicioso falla, el problema puede resolverse mediante la programación dinámica (DP).
PROGRAMACIÓN DINÁMICA [[DP]]
En mi opinión, este es uno de los temas más importantes en la programación competitiva. Los problemas son simples y fáciles de codificar pero difíciles de dominar. Practique tantos problemas de DP como sea posible.
Debe seguir este tutorial de topcoder y debe intentar resolver todos los problemas enumerados a continuación en este documento.
(Estos son problemas básicos y algunos con pocas variaciones que creemos que uno debería saber. También debe practicar otros problemas de DP)
Lista de problemas
- SPOJ.com – Problema MONEDAS
- Lea sobre la Submatriz de suma máxima [No encuentro la pregunta exacta sobre cualquier juez en línea, ya que es muy básica]
- Asistente de postre
- Makx Sum
- Q) Encontrar NCR [Usando la recursión discutida anteriormente en la sección de matemáticas y DP]
- Problema 18 – Proyecto Euler
- P) Dada una matriz llena de números. Inicialmente se encuentra en la esquina superior izquierda, debe alcanzar la página inferior derecha en la esquina. En cada paso puede ir hacia la derecha o hacia abajo. Cuando vaya a una celda, sus puntos aumentarán por valor de esa celda. ¿Cuál es el máximo de puntos posibles que puede ganar?
- Pequeño elefante y ratones
- SPOJ.com – Problema MAXWOODS
- SPOJ.com – Problema EDIST
- SPOJ.com – Problema ADFRUITS
- SPOJ.com – Problema IOIPALIN
- Polo el pingüino y la prueba
- Maxim y progresiones
- Pequeño elefante y globos
- Delivery de pizza
- Chefs nueva mascota
Para más temas avanzados, puede seguir los tutoriales de topcoder.
Esto también podría ser una introducción útil a la programación competitiva: Stanford .
Copiado de: http: //sportprogramming.blogspot…