exercício de programação dinâmica sobre cortar cordas


16

Eu tenho trabalhado no seguinte problema deste livro .

Uma certa linguagem de processamento de string oferece uma operação primitiva que divide uma string em duas partes. Como esta operação envolve a cópia da sequência original, leva n unidades de tempo para uma sequência de comprimento n, independentemente da localização do corte. Suponha, agora, que você queira quebrar uma corda em vários pedaços. A ordem na qual as quebras são feitas pode afetar o tempo total de execução. Por exemplo, se você deseja cortar uma cadeia de 20 caracteres nas posições 3 e 10 , fazer o primeiro corte na posição 3 incorre em um custo total de 20+17=37 , enquanto fazer a posição 10 primeiro tem um custo melhor de 20+10=30.

Preciso de um algoritmo de programação dinâmica que, com cortes de m , encontre o custo mínimo de cortar uma string em m+1 pedaços.

Respostas:


10

A idéia básica é: experimente todas as posições de corte como primeira escolha, resolva as respectivas peças recursivamente, adicione o custo e escolha o mínimo.

Na fórmula:

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

Observe que a aplicação de memoisation a essa recursão economiza trabalho, pois a troca da ordem de qualquer par de cortes aplicado sucessivamente resulta nos mesmos três subproblemas sendo resolvidos.


1

É sempre uma boa ideia encontrar um algoritmo recursivo primeiro e depois transformá-lo em uma tabela.

  1. f(C,n)
  2.   se (C = ) retornar 0;
  3.   outro
  4.     opt = infinito;
  5.     para cada façacC
  6.       D={dC:d<c}
  7.       E={ec:eD,e>c}
  8.       opt=min{opt,f(D,c)+f(E,nc)}
  9.     return ;opt+n

Então você pode perguntar: não há muitos subconjuntos de C para serem colocados em uma tabela? Observe que apenas subconjuntos 'consecutivos' são necessários. E existem apenas deles (porque) Outro problema é:.? Algumas entradas irá alterar o valor emE. Podemos contornar isso indicando início e fim em cadaf, emvez de apenas especificar o comprimento.(n2)Ef


0

Isso é muito semelhante ao Quicksort em um multiset; é ideal quando o ponto de corte estiver mais próximo do meio e, em seguida, recuaremos.

sk

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.