Pregunta sobre el algoritmo LC: programación dinámica dp

  1. Hermosa disposición
    Supongamos que hay N números enteros de 1 a N. Si se construye con éxito una matriz a partir de estos N números, de modo que el i-ésimo bit de la matriz (1 <= i <= N) satisfaga una de las dos condiciones siguientes, A este conjunto lo llamamos un hermoso arreglo. condición:

El número en la posición i-ésima es divisible por i.
i es divisible por el número en la posición i-ésima
. Ahora, dado un número entero N, ¿cuántos arreglos hermosos se pueden construir?

Método 1: estado dp

  1. Número de caminos fuera de límites
  2. Te dan una cuadrícula de tamaño mxn y una pelota. Las coordenadas iniciales de la pelota son [startRow, startColumn]. Puedes mover la bola a celdas adyacentes en cuatro direcciones (y a través de los límites de la cuadrícula para llegar fuera de la cuadrícula). Puedes mover la pelota hasta tiempos máximos de movimiento.

Dados cinco enteros m, n, maxMove, startRow y startColumn, encuentre y devuelva el número de caminos que pueden mover la pelota fuera del límite.

Método 1: ruta dp

  1. El Registro de asistencia estudiantil II
    puede representar el registro de asistencia de un estudiante como una cadena, donde cada carácter se usa para marcar la asistencia del día (ausente, tarde, presente). El registro solo contiene los siguientes tres caracteres:
    'A': Ausente, ausente
    'L': Tarde, tarde
    'P': Presente.
    Si los estudiantes pueden cumplir las dos condiciones siguientes al mismo tiempo, pueden obtener recompensas por asistencia:

La ausencia de un estudiante ("A") es estrictamente inferior a dos días según la asistencia total.
Los estudiantes no llegarán tarde ("L") durante 3 días consecutivos o más de 3 días consecutivos.
Se le proporciona un número entero n, que representa la longitud (número de veces) del registro de asistencia. Devuelva el número de situaciones de registro que pueden recibir recompensas por asistencia cuando la duración del registro es n. La respuesta puede ser grande, por lo que se devuelve el resultado módulo 109 + 7.

## El costo mínimo para llegar al destino dentro del tiempo especificado (o número de veces)
lc787. El vuelo más barato dentro del traslado de la estación K
lc1928. El costo mínimo para llegar al destino dentro del tiempo especificado
Método: regla de rotación dfs

650. Teclado con sólo dos teclas
Inicialmente sólo había un carácter 'A' en el Bloc de notas. Puede realizar dos operaciones en este bloc de notas a la vez:
Copiar todo: copia todos los caracteres en este bloc de notas (no se permite copiar solo algunos caracteres).
Pegar: pega el último carácter copiado.
Dado un número n, debe utilizar el número mínimo de operaciones para generar exactamente n 'A en el Bloc de notas. Devuelve el número mínimo de operaciones que pueden imprimir n 'A's.

629. K matrices de pares en orden inverso.
Dados dos números enteros n y k, encuentre el número de matrices diferentes que contienen números del 1 al n que tienen exactamente k pares en orden inverso.
La definición de un par de orden inverso es la siguiente: Para los elementos i-ésimo y j-ésimo de la matriz, si i < j y a[i] > a[j], es un par de orden inverso; en caso contrario , No lo es.
Dado que la respuesta puede ser grande, solo es necesario devolver el valor mod 109 + 7 de la respuesta.

375. Adivina el número II
Estamos jugando a un juego de adivinanzas, las reglas del juego son las siguientes:

Elijo un número del 1 al n.
Adivinas qué número elegí.
Si adivinas el número correcto, ganas el juego.
Si adivinas mal, te diré que el número que elegí es mayor o menor que el tuyo y que debes seguir adivinando.
Cada vez que adivinas el número x y lo haces mal, pagas x cantidad de efectivo. Si te quedas sin dinero, pierdes el juego.
Dado un número específico n, devolver la cantidad más pequeña de efectivo que le garantice una ganancia, sin importar qué número elija.

688. Probabilidad del caballo en el tablero de ajedrez Idea
: La programación dinámica f[paso][i][j] representa la probabilidad de caminar un paso hacia i, j. f[paso][i][j] se obtienen transfiriendo f[paso][ni][nj]/8 en 8 direcciones. Un truco: cambie la probabilidad de dar k pasos desde las posiciones de fila y columna a dar k pasos desde todo el tablero de ajedrez hasta las posiciones de fila y columna.

887. Egg Drop
te da k huevos idénticos y puedes usar un edificio con n pisos desde el 1er al enésimo piso.
Se sabe que hay un piso f que satisface 0 <= f <= n. Cualquier huevo que se caiga desde un piso más alto que f se romperá. Los huevos que se caigan desde un piso f o un piso más bajo que este no se romperán.
Para cada operación, puedes tomar un huevo intacto y dejarlo caer desde cualquier piso x (satisfaciendo 1 <= x <= n). Si el huevo se rompe, no podrás volver a usarlo. Si un huevo no se rompe después de caerse, puede reutilizarse en operaciones posteriores.
¿Podría calcular y devolver el número mínimo de operaciones necesarias para determinar el valor exacto de f?

Idea: A primera vista parece que se puede dividir en dos, pero en este caso no se usa k, además al dividir en dos no se considera el costo de tirar el huevo en pedazos, se puede usar programación dinámica Para este problema, dp [k] [n] representa el número actual de Hay k huevos y el número mínimo de veces para tirar huevos en n pisos.
Al tirar huevos en el x piso:
Si los huevos no se rompen, entonces el estado pasa a ser (k, nx), es decir, el número de nuestros huevos permanece sin cambios, pero la respuesta solo puede estar en los nx pisos superiores. En otras palabras, hemos reducido el problema original a un subproblema de tamaño (k, nx);
si el huevo se rompe, el estado pasa a ser (k−1,x−1), es decir, tenemos un huevo menos. , pero sabemos que la respuesta solo puede estar en el piso x-1 debajo del piso x-ésimo. En otras palabras, reducimos el problema original a un subproblema de tamaño (k-1, x-1).
dp(k,n)=1+ 1≤x≤nmin (max(dp(k−1,x−1),dp(k,n−x))).
La complejidad general es O (k n n), por lo que necesitamos optimizar la lógica para calcular el dp [k] [n] actual. Originalmente, enumeramos los pisos y, en primer lugar, cuando k es fijo, dp debe ser monótono. Esto es comprensible progresivamente: cuanto más alto sea el piso, mayor será el número de operaciones. Uno de dp(k−1,x−1) y dp(k,n−x) (ignorando k en la primera dimensión) aumenta y el otro disminuye (cuando x aumenta). En este momento, es casi como se muestra en Como se muestra en la siguiente figura Insertar descripción de la imagen aquí
: Si toma el valor mínimo mayor de estos dos, debe obtener la posición de intersección de t1 y t2. Los dos lados de esta intersección se ajustan a la dicotomía (como se muestra en la figura), por lo que se pueden dividir en dos. También tenga en cuenta que las funciones de ambos no son continuas sino discretas. Por ejemplo, solo los números enteros 1, 2 y 3 pueden ser tomado. Por lo tanto, el punto de intersección puede no ser un número entero. En este momento, solo los x0 y x1 más cercanos al punto de intersección Con estos dos puntos, se puede calcular el valor dp actual (evidente).

72. Editar distancia
Dadas dos palabras, palabra1 y palabra2, devuelva el número mínimo de operaciones utilizadas para convertir palabra1 en palabra2.
Puede realizar las siguientes tres operaciones en una palabra:
insertar un carácter,
eliminar un carácter,
reemplazar un carácter

Discuta caso por caso. Primero, la inserción y la eliminación son simétricas, por lo que solo se consideran los casos de inserción y reemplazo.
Por tanto, existen tres situaciones:
inserción A, inserción B y modificación A o B.
Sea dp[i][j] la distancia de edición de A0,A1,…,Ai y B0,B1,…,Bj. Según la situación anterior, considere cómo convertir a dp[i][j].

926. Invierta una cadena para que aumente monótonamente.
Si una cadena binaria consta de algunos ceros (tal vez ningún cero) seguidos de algunos unos (tal vez ningún uno), entonces la cadena aumenta monótonamente.
Dada una cadena binaria s, puedes convertir cualquier 0 en 1 o un 1 en 0.
Devuelve el número mínimo de lanzamientos que hacen que s aumente monótonamente.

871. Número mínimo de repostajes
Defina dp[j] para representar la distancia máxima que se puede recorrer j veces de reabastecimiento de combustible. Después de actualizar la matriz dp, recorra de subíndices pequeños a grandes. Si dp[i] es mayor que el objetivo, puede ser devuelto directamente.
¿Cómo actualizar la matriz dp? dp[0]=startfuel es obvio, luego recorre cada estación de servicio de acuerdo con la distancia y actualiza dp i cada vez en función de si dp[i] es mayor que la distancia a la estación de servicio .

522. La secuencia especial más larga II
es esencialmente una prueba de LCS. Esta pregunta necesita saber primero que si una de las cadenas es una subcadena de otra cadena, entonces no habrá ninguna cadena especial. Y si una cadena no es una subcadena de otra cadena, entonces la cadena especial de la cadena es ella misma. Si sabes esto, simplemente realiza un doble ciclo.

873. La longitud de la subsecuencia de Fibonacci más larga,
fibonacci, está determinada por dos números: f[i][j]: arri es el primer número desde abajo, arrj es el segundo número desde abajo y la longitud de la secuencia es el segundo número desde abajo. Se pueden obtener y registrar tres números. Se puede obtener el mapa de arr[i] a i, y luego se puede obtener el índice del tercer número desde el último. Luego se puede obtener la ecuación de transferencia obtenido.

Supongo que te gusta

Origin blog.csdn.net/weixin_45719581/article/details/119740821
Recomendado
Clasificación