esercizio di programmazione dinamica sul taglio delle stringhe


16

Ho lavorato al seguente problema di questo libro .

Un certo linguaggio di elaborazione delle stringhe offre un'operazione primitiva che divide una stringa in due parti. Poiché questa operazione comporta la copia della stringa originale, sono necessarie n unità di tempo per una stringa di lunghezza n, indipendentemente dalla posizione del taglio. Supponiamo ora di voler spezzare una stringa in più pezzi. L'ordine in cui vengono eseguite le interruzioni può influire sul tempo di esecuzione totale. Ad esempio, se vuoi tagliare una stringa di 20 caratteri nelle posizioni 3 e 10 , fare il primo taglio nella posizione 3 comporta un costo totale di 20+17=37 , mentre fare prima la posizione 10 ha un costo migliore di 20+10=30.

Ho bisogno di un algoritmo di programmazione dinamica che fornisca tagli m , trova il costo minimo per tagliare una stringa in m+1 pezzi.

Risposte:


10

L'idea di base è: provare tutte le posizioni di taglio come prima scelta, risolvere ricorsivamente le rispettive parti, aggiungere il costo e scegliere il minimo.

In formula:

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

Si noti che l'applicazione della memoisation a questa ricorsione in realtà consente di risparmiare lavoro poiché il cambio dell'ordine di qualsiasi coppia di tagli applicata successivamente porta alla risoluzione degli stessi tre sottoproblemi.


1

È sempre una buona idea trovare prima un algoritmo ricorsivo e poi trasformarlo in una tabella.

  1. f(C,n)
  2.   se (C = ) restituisce 0;
  3.   altro
  4.     opt = infinito;
  5.     per ogni docC
  6.       D={dC:d<c}
  7.       E={ec:eD,e>c}
  8.       opt=min{opt,f(D,c)+f(E,nc)}
  9.     ritorno ;opt+n

Quindi potresti chiedere: non ci sono troppi sottoinsiemi di C da mettere in una tabella? Si noti che sono necessari solo sottoinsiemi "consecutivi". E ci sono solo di loro (perché) Un altro problema è:.? Alcune voci cambieranno valoreE. Possiamo aggirare il problema indicando l'inizio e la fine di ciascunafanziché specificando semplicemente la lunghezza.(n2)Ef


0

Questo è molto simile a Quicksort su un multiset; è ottimale quando il punto di taglio è il più vicino al centro e quindi si ricorre.

sk

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.