Ideas comunes de resolución de problemas de programación dinámica e implementación de Java

Introducción al proyecto

  • Este proyecto descompone las preguntas comunes de entrevistas escritas de las principales fábricas, rastrea la fuente hasta los principios de implementación subyacentes de las estructuras de datos y los algoritmos, y sabe cuáles son.
  • Establezca un sistema de estructura de conocimiento para una búsqueda fácil, dé la bienvenida a más amigos de ideas afines a unirse al proyecto AlgorithmPractice (los problemas y las solicitudes de extracción son bienvenidos).

Primera parte: pequeña prueba

Esta parte del contenido seleccionó algunos temas de programación dinámica relativamente simples para comprender gradualmente qué es la programación dinámica.

Segunda parte: presentar

Esta parte del contenido solo brinda la solución básica, si hay una solución más optimizada, deje un mensaje a continuación.

Tercera parte: aspectos destacados completos

La solución de esta parte del contenido no se limita a la programación dinámica, incluyendo codiciosos, retrocesos, etc.

Inicio del texto

1. La rana salta las escaleras

  • Descripción del título: Al subir escaleras, puede subir 1 o 2 escalones cada vez y preguntar de cuántas formas hay n escalones de escaleras.
  • Implementación del código: ClimbStairs , caso de prueba: ClimbStairsTest
  • Ideas de diseño:
    • Ecuación de transición de estado:
statusNum[i] = statusNum[i-1] + statusNum[i-2];
  • Precauciones:
    • Para los datos a los que se accede con frecuencia, la caché se puede configurar para facilitar la lectura.

2. La mayor suma de subsegmentos

  • Descripción del título: dada una matriz, encuentre la suma del segmento más grande en las submatrices consecutivas de esta matriz
  • Implementación de código: LSS , caso de prueba: LSSTest
  • Ideas de diseño:
  • Método de programación dinámica:
状态转换方程:
LargestSum[i] = Math.max(LargestSum[i-1] + Sequence[i], Sequence[i]);
  • Método de optimización de programación dinámica:
for(int i = 1; i < Sequence.length; i++){
    
    
	sum_temp += Sequence[i];
	if(sum_temp <= Sequence[i]){
    
      //新开始
		sum_temp = Sequence[i];   //sum清空
		begin_temp = i;           //假定的起始位置
	}
	if(sum < sum_temp){
    
    
		sum = sum_temp;           //记录最大值
		begin = begin_temp;       //假定的起始地址赋值给起始地址
		end = i;                  //结束地址包括 i
	}
}
  • Divide y conquistaras:
int leftValue = divide(Sequence, left, mid);
int rightValue = divide(Sequence, mid + 1, right);
int midValue = mid(Sequence, left, right);
  • Precauciones:

3. La subsecuencia común más larga

  • Descripción del título: busque la subcadena coincidente más grande de dos cadenas
  • Implementación de código: LCS , caso de prueba: LCSTest
  • Ideas de diseño:
    • Ecuación de transición de estado:
num_matrix[row][column] = num_matrix[row-1][column-1]+1;
num_matrix[row][column] = num_matrix[row-1][column];
num_matrix[row][column] = num_matrix[row][column-1];
  • Precauciones:

4. Aplicación Palindrome (Palindrome)

4.1. Determinar si una cuerda pertenece a un palíndromo

  • Descripción del título: juzga si una cadena dada es un palíndromo, por defecto, un solo carácter no es suficiente para hacer un palíndromo
  • Código:
public boolean PalindromeJudge(String testString) {
    
    
	if(testString == null || testString.length() == 0){
    
    
		return false;
	}
	boolean flag = new StringBuffer(testString).reverse().toString().equals(testString);
	return flag;
}
  • Idea de diseño: cadena inversa y combinación
  • Precauciones:
4.2. Agrega un personaje para construir un palíndromo

  • Descripción del título: Dada una cadena s, puede agregar un carácter para convertir la cadena restante en un palíndromo. Si obtiene un palíndromo al agregar un carácter, devuelva la posición del elemento agregado (dirección inicial: 1) , De lo contrario devuelve -1, si es un palíndromo, devuelve la posición media
  • Implementación de código: CreatePalindromebyAdd , caso de prueba: CreatePalindromebyAddTest
  • Ideas de diseño:
  • Precauciones:
4.3, elimina algunos caracteres para construir un palíndromo

  • Descripción del título: Dada una cadena s, puede eliminar algunos caracteres de ella, haciendo que la cadena restante sea un palíndromo. ¿Cómo eliminar para que el palíndromo sea más largo? Salida del número de caracteres que se eliminarán
  • Implementación de código: CreatePalindromebyDelete , caso de prueba: CreatePalindromebyDeleteTest
  • Idea de diseño: la cadena se invierte y el algoritmo LCS calcula el número máximo de similitud, por lo que los números que no son similares deben eliminarse.
  • Precauciones:
4.4. Encuentre la subcadena palíndromo continua más larga en una cadena dada

  • Descripción del Título:
  • Implementación de código: FindPalindrome , caso de prueba: FindPalindromeTest
    • 4.4.1, ley de violencia
    • 4.4.2, método de difusión central
    • 4.4.3, algoritmo de Manacher
  • Ideas de diseño:
    • 4.4.1, ley de violencia
    • 4.4.2, método de difusión central
    • 4.4.3, algoritmo de Manacher
  • Precauciones:

5. La ruta de entrega más corta

  • Descripción del tema: Un
    repartidor de logística p debe entregar paquetes en 4 puntos express a, b, cy d. ¿Qué ruta debe elegir el repartidor para completar la entrega más corta? Suponiendo las coordenadas del punto de inicio (0,0) del despachador como se muestra en la figura, la ruta de despacho solo puede viajar a lo largo del lado del cuadrado en la imagen, cada cuadrado pequeño es cuadrado y la longitud del lado es 1, como la distancia de p ad es 4. . Ingrese aleatoriamente las coordenadas de n puntos de entrega y encuentre el valor de ruta de entrega más corta (la distancia desde el punto de partida para completar la entrega de n puntos y de regreso al punto de partida).
    Inserte la descripción de la imagen aquí
  • Código:
  • Ideas de diseño:
    • cómo estás
    • Retroceso
  • Precauciones:

6. El problema de la programación óptima

  • Descripción del título: Hay n tareas que deben completar k máquinas que pueden trabajar en paralelo, y el tiempo necesario para completar la tarea i es tasksspendTime. Intente diseñar un algoritmo para encontrar el mejor horario para completar estas n tareas, de modo que el tiempo para completar todas las tareas sea el más temprano
  • Implementación de código: OptimalSchedule , caso de prueba: OptimalScheduleTest
  • Ideas de diseño:
  • Precauciones:

7. La subsecuencia creciente más larga

  • Descripción del título: En una secuencia numérica determinada, busque una subsecuencia de modo que los valores de los elementos de esta subsecuencia aumenten secuencialmente y la longitud de esta subsecuencia sea lo más grande posible. Los elementos en la subsecuencia creciente más larga no son necesariamente consecutivos en la secuencia original
  • Implementación de código: LIS , caso de prueba: LISTest
  • Ideas de diseño:
  • Precauciones:

8. La plaza más grande

9. Editar la distancia

  • Descripción del título: la
    distancia de edición se refiere al número mínimo de operaciones de edición de un solo carácter necesarias para convertir una palabra en otra entre dos palabras. Aquí solo se definen tres operaciones de edición de un solo carácter: Insertar, Eliminar y Sustituir.
    Por ejemplo, las dos palabras "gatito" y "sentado" se convierten de "gatito" a "sentado" "Las operaciones mínimas de edición de un solo carácter requeridas son:
    1. gatito → sitten (sustitución de“ s ”por“ k ”)
    2. sitten → sittin (sustitución de“ i ”por“ e ”)
    3. sittin → sentado (inserción de "G" al final)
    Por lo tanto, la distancia de edición entre las palabras "gatito" y "sentado" es 3.
  • Implementación de código: EditDistance , caso de prueba: EditDistanceTest
  • Ideas de diseño:
    • Ecuación de transición de estado:
if (c1[i-1] == c2[j-1]) {
    
    
  comp[i][j] = comp[i - 1][j - 1];
} else {
    
    
  comp[i][j] = Math.min(Math.min(comp[i - 1][j - 1], comp[i][j - 1]), comp[i - 1][j]) + 1;
}
  • Precauciones:

a, problema de la mochila (mochila)

  • Descripción del Título:
  • Implementación de código: mochila , caso de prueba:
  • Ideas de diseño:
  • Precauciones:

b. Coro

  • Descripción del tema: Hay n estudiantes parados en una fila, y cada estudiante tiene un valor de habilidad. Niu Niu quiere seleccionar ChoseNum estudiantes en orden de estos n estudiantes, y la diferencia entre los números de posición de dos estudiantes adyacentes no es mayor que d, de modo que El producto de los valores de capacidad de los estudiantes de ChoseNum es el más grande. ¿Puede devolver el producto más grande?
  • Código:
  • Ideas de diseño:
    • Programación dinámica:
    • Método de retroceso:
  • Precauciones:

Supongo que te gusta

Origin blog.csdn.net/ljfirst/article/details/103082359
Recomendado
Clasificación