ejercicio de programación dinámica para cortar cuerdas

16

He estado trabajando en el siguiente problema de este libro .

Un cierto lenguaje de procesamiento de cadenas ofrece una operación primitiva que divide una cadena en dos partes. Como esta operación implica copiar la cadena original, se necesitan n unidades de tiempo para una cadena de longitud n, independientemente de la ubicación del corte. Supongamos, ahora, que quiere romper una cadena en muchas partes. El orden en que se realizan los descansos puede afectar el tiempo total de ejecución. Por ejemplo, si desea cortar una cadena de 20 caracteres en las posiciones 3 y 10 , entonces hacer el primer corte en la posición 3 incurre en un costo total de 20+17=37 , mientras que hacer la posición 10 primero tiene un mejor costo de 20+10=30.

Necesito un algoritmo de programación dinámico que, dado m cortes, encuentre el costo mínimo de cortar una cadena en m+1 piezas.

marca
fuente

Respuestas:

10

La idea básica es: Pruebe todas las posiciones de corte como primera opción, resuelva las partes respectivas de forma recursiva, agregue el costo y elija el mínimo.

En la fórmula:

mino(s,C)={|s|,|C|=1|s|+mincC[mino(s1,c,{cCc<c}) + mino(sc+1,|s|,{ccCc>c})], else

Tenga en cuenta que aplicar la memorización a esta recursión realmente ahorra trabajo, ya que cambiar el orden de cualquier par de cortes aplicados sucesivamente da como resultado la resolución de los mismos tres subproblemas.

Rafael
fuente
1

Siempre es una buena idea encontrar primero un algoritmo recursivo y luego convertirlo en una tabla.

  1. f(C,n)
  2.   si (C = ) devuelve 0;
  3.   más
  4.     opt = infinito;
  5.     para cada docC
  6.       D={dC:d<c}
  7.       E={ec:eD,e>c}
  8.       opt=min{opt,f(D,c)+f(E,nc)}
  9.     opt+n

(n2)Ef

Dimitar Stratiev
fuente
0

Esto es muy similar a Quicksort en un conjunto múltiple; es óptimo cuando el punto de corte está más cerca del medio, y luego recurrimos.

sk

KWillets
fuente