[Notas de lectura] "Competencia de programación de desafíos"

"Competencia de programación de desafíos"

Directorio de artículos


Prefacio

La perseverancia es la victoria, apresúrate por ella


1. Listo para usar: preparación

1.5.1 Complejidad del algoritmo

Inserte la descripción de la imagen aquí
Fuente de resumen detallada

1.6.1 Problema del triángulo O (nlogn)

Inserte la descripción de la imagen aquí

Método O (nlogn):

  1. Ordene los bordes en orden ascendente;
  2. Busque de grande a pequeño, si la arista [i], la arista [i + 1], la arista [i + 2] pueden formar un triángulo, es decir, un triángulo con un perímetro grande;

Razón:
Condición del triángulo: A <B + C (donde A es el lado más largo);
para que el perímetro sea el más largo, B + C debe ser lo más grande posible;
después de clasificar, los lados restantes de B + C deben ser los más grandes , si no Si se satisface, no hay arista que pueda satisfacer B + C> A, es decir, para A, no hay triángulo, si se satisface, es el triángulo de mayor circunferencia;

Ejercicio 976. Perímetro máximo de un triángulo

Perimetral 976.

1.6.2 Problema de hormigas

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Cuando las hormigas cambian de dirección, se considera que no hay cambio de dirección, de todos modos las hormigas se arrastran hacia la izquierda y hacia la derecha. El código específico es el siguiente:
Inserte la descripción de la imagen aquí

1.6.3 Lotería (suma de cuatro números)

Inserte la descripción de la imagen aquí

Descripción del problema: ¿Existe la matriz: a + b + c + d = m
Solución: Considérelo como la suma de los dos primeros números y la suma de los dos últimos números, utilizando la búsqueda binaria, la eficiencia es (O (n ^ 2logn)

Ejercicio 18. Suma de cuatro números

18. Suma de cuatro números

Usado en el blog: ordenar primero; puntero doble (O (n ^ 3)), método de retroceso (se eliminarán las condiciones de uso)

2. Principiante-Primaria

2.1 "Búsqueda exhaustiva" -Violencia

Búsqueda exhaustiva: enumere todas las posibilidades y encuentre respuestas entre ellas
Recurrencia: llámese a sí mismo

estructura de datos:

Pila (LIFO): empujar; pop; mirar;
Cola (FIFO): oferta; encuesta; mirar;

Método transversal:

Recorrido en profundidad primero (DFS): profundo; pila; (resolución de Sudoku)
recorrido en profundidad primero (BFS): circundante; cola (ruta más corta, operación mínima)

2.1.4 DFS-el número de charcos

Inserte la descripción de la imagen aquí
Ideas:

  1. El sistema de ocho conexiones es un charco de agua. Debe atravesar las ocho unidades cerca de una unidad y cambiarlas a '.';
  2. dfs atraviesa hasta el final, y cambia todas las W de estos Unicom; todas las W conectadas por W se reemplazan con '.';
  3. Hasta que W ya no exista en la figura, el número de veces que se ejecutará dfs es el número de charcos.

Ejercicio 200. Número de islas

200. Número de islas

2.1.5 BFS: el camino más corto del laberinto

Inserte la descripción de la imagen aquíInserte la descripción de la imagen aquí

Pregunta: Laberinto de especificación N * M; punto de inicio S; punto final G; pared #; paso; encuentre el camino más corto desde el punto de inicio hasta el punto final

Ideas:

  1. Esta pregunta requiere la distancia más corta, puede usar la matriz d [N] [M] para guardar la distancia, inicializar INF, establecer la distancia del punto de inicio en 0;
  2. Establezca la distancia de arriba, abajo, izquierda y derecha (móvil, canal) a la distancia del punto actual +1, y únase a la cola;
  3. Lea los nodos en la cola, BFS recorre hacia arriba, hacia abajo, hacia la izquierda y hacia la derecha, hasta que se alcanza el final o se accede a todos los nodos;
  4. Si llega al punto final, es la distancia más corta, si finaliza la visita al punto, es inalcanzable;

2.1.6 next_permutation (begin (nums), end (nums))

El siguiente orden de la matriz nums se da en orden lexicográfico;
se puede usar en lenguaje C ++ para obtener el siguiente orden convenientemente; java no

Ejercicio 31. Siguiente permutación

31. Siguiente permutación

2.1.7 Poda

En casos de violencia, a veces el espacio de la solución es muy grande y la profundidad es DFS, ya veces se puede omitir y podar de acuerdo con ciertas condiciones para reducir el espacio de la solución;

2.2 ¡Sigue adelante! -avaro

Codicioso: elige constantemente la mejor estrategia actual con codicia
Mi experiencia: depende principalmente de si el problema puede convertirse en el mismo subproblema codicioso después de una elección codiciosa

2.2.1 Problema de monedas

Inserte la descripción de la imagen aquí
Idea: Dar prioridad al canje de monedas con denominaciones grandes.

2.2.2 Problema de intervalo

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Idea: entre los trabajos disponibles, elija el trabajo con la hora de finalización más temprana cada vez

2.2.3 Problema de orden léxico mínimo

Inserte la descripción de la imagen aquí

Idea: sigue tomando los caracteres más pequeños al principio y al final de S y ponlos al final de T. Si son iguales, compara el orden lexicográfico de S e invierte S ', elige los caracteres más pequeños y colócalos en el final de T;

2.2.4 Otros problemas

Inserte la descripción de la imagen aquí

Idea: Recorre los puntos de selección lo más lejos posible hacia la derecha para lograr cobertura, de modo que finalmente se obtengan la menor cantidad de puntos
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Idea: análogamente al árbol de Huffman, la tabla más corta es la más lejana, y la suma de la ruta ponderada final es la más pequeña;
Codicioso: también puede usar la cola de prioridad mencionada en 2.4.1 para obtener las dos tablas más pequeñas y volver a unir las Longitud de la tabla Cola de prioridad

2.3 Reutilización de la programación dinámica de resultados registrados

Programación dinámica (DP): registrar resultados y reutilizar
Mi experiencia: buscando relaciones de recurrencia

2.3.1 Problema de la mochila

Principalmente dividido en 01 problema de mochila y problema de mochila completa
Inserte la descripción de la imagen aquí
Relación de recurrencia:
01 problema de mochila:
el registro de la fila anterior es necesario para actualizar la nueva fila; la
posición vertical hacia arriba es el componente directo del registro de la fila anterior (para lograr la retención del valor máximo de la fila anterior); La
posición de la esquina superior oblicua debe sumar el valor del artículo (para lograr el valor máximo de retención); los dos son más grandes. La
versión final del código:
Inserte la descripción de la imagen aquí
PS: j atraviesa de atrás a frontal; asegúrese de que se utilizan las posiciones superior e izquierda superior para lograr la actualización; asegúrese de que la ronda anterior de datos históricos no esté cubierta; es difícil, es fácil de operar mal en la operación real; el
Inserte la descripción de la imagen aquí
rango de parámetros ha cambiado , donde w se ha vuelto muy grande, de acuerdo con la idea anterior, no es factible;
necesita intercambiar wyv; finalmente busque la w calificada en la última línea; el código específico es el siguiente:

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Problema de mochila completa:
El registro de la línea anterior y la parte anterior de la misma línea son necesarios para actualizar la nueva posición; la
posición vertical hacia arriba es el desplazamiento directo hacia abajo del registro de la línea anterior (para lograr la retención del valor máximo de la línea anterior); la
posición frontal izquierda es Necesidad de agregar el valor del artículo (en este momento, los artículos agregados antes se consideran para realizar la adición de varios artículos); los dos son más grandes

La versión final del código:
Inserte la descripción de la imagen aquí
PS: j comienza desde w [i], es decir, puede dejar el elemento; recorra de adelante hacia atrás, actualice primero el valor anterior, porque este último debe modificarse de acuerdo con el valor del frente izquierdo;

2.3.2 El problema de subsecuencia común más largo LCS

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
PD: puedes saber,

  1. dp [i + 1] [j]: (usando el frente izquierdo) es que el carácter i no coincide con el carácter j, pero el carácter i tiene una relación coincidente con el carácter antes de j, y el registro de la izquierda debe mantenerse ;
  2. dp [i] [j + 1]: (usando la línea anterior) el carácter i no coincide con el carácter j, y el carácter i no coincide con todos los caracteres antes de j, y es necesario mantener el registro de la línea anterior ;
  3. dp [i] [j] +1: (usando diagonal) es la coincidencia entre el carácter i y el carácter j, el número de caracteres coincidentes es +1, y cuando coinciden, dp [i] [j] +1 es definitivamente el más grande, sea directamente dp [i + 1] [j + 1] = dp [i] [j] +1 muy bien

Ejercicio 1143. Subsecuencia común más larga

Acr 1143.

2.3.3 Múltiples partes y problemas

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Ejercicio 416. Dividir iguales y subconjuntos

416. Divida subconjuntos iguales y
en el conjunto para encontrar si se cumple la mitad del objetivo de la suma establecida;

El algoritmo principal es encontrar el número y su suma satisface el objetivo, utilizando la idea dp;
en este momento, el número repetido se considera un elemento diferente (filas diferentes, registrar el cálculo del resultado, más como 01 mochila);
múltiples partes y el mismo valor en el problema, es el mismo elemento, en la misma fila, use el registro histórico de la izquierda para calcular;

2.3.4 El problema de la subsecuencia ascendente más larga LIS

Inserte la descripción de la imagen aquí

Ejercicio 300. La subsecuencia ascendente más larga

300. La subsecuencia ascendente más larga.
PD: El método de búsqueda binaria no es muy claro y se necesita más reflexión.

2.3.5 Conversión de puntuaciones (un poco difícil, mira hacia atrás)

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

2.3.6 Número de combinaciones de conjuntos múltiples

Inserte la descripción de la imagen aquí

2.4 Procesamiento y almacenamiento de la estructura de datos-datos

2.4.1 Montón

Cola de prioridad : una estructura de datos que implementa las siguientes operaciones

  1. Inserte un valor;
  2. Obtenga el valor mínimo.

Montón : la estructura de datos (montón raíz grande, montón raíz pequeño) que implementa de manera eficiente las operaciones de cola de prioridad (se puede usar la estructura de árbol binario)
complejidad: proporcional a la profundidad del árbol; ambas operaciones son O (logn) completadas en
java: PriorityQueue cola de prioridad ;

PriorityQueue<Integer> minHeap = new PriorityQueue<Integer>(); //小顶堆,默认容量为11
PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(11, new Comparator<Integer>(){
    
     //大顶堆,容量11
	 @Override
	 public int compare(Integer a,Integer b){
    
    
	 	return b-a;
	 }
});

Problema de viaje de expedición

Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

2.4.2 Árbol de búsqueda binaria

Árbol de búsqueda binaria : estructura de datos que implementa las siguientes operaciones. Todos los nodos satisfacen que todos los nodos del subárbol izquierdo sean más pequeños que ellos mismos y que todos los nodos del subárbol derecho sean más grandes que ellos mismos.
Complejidad: proporcional a la profundidad del árbol; ambas operaciones se completan en O (logn)

  1. Inserte un valor;
  2. Consultar si contiene un determinado valor;
  3. Eliminar un valor.

En java, practique el uso de colecciones de listas y mapas más

Árbol de búsqueda binaria equilibrado : la diferencia de altura entre el subárbol izquierdo y el subárbol derecho de cualquier nodo no es más de 1; (para resolver el problema de la degradación del árbol de búsqueda binaria) Cuando el
árbol de búsqueda binaria está desequilibrado, gírelo para mantener el equilibrio

2.4.3 Conjunto de búsqueda de sindicatos (desconocido)

Recopilación de cheques concurrentes: la estructura de datos utilizada para administrar la agrupación de elementos. Las siguientes operaciones se pueden realizar de forma eficaz.

  1. Consultar si el elemento ay el elemento b pertenecen al mismo grupo;
  2. Combine el grupo del elemento ay el elemento b.

Complejidad: O (a (n))
Inserte la descripción de la imagen aquí

Estructura: bosque; diferentes conjuntos están representados por diferentes árboles;

fusionar: fusionar entre dos árboles
Inserte la descripción de la imagen aquí
Consulta: recorrer desde el fondo hasta la raíz para determinar si la misma raíz
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí
Inserte la descripción de la imagen aquí

Inserte la descripción de la imagen aquí
Omitir, volver a recuperar, primero extraer los puntos de conocimiento

2.5 Son en realidad "imágenes"

Supongo que te gusta

Origin blog.csdn.net/qq_39457586/article/details/109746429
Recomendado
Clasificación