latihan pemrograman dinamis pada cutting string

16

Saya telah mengerjakan masalah berikut dari buku ini .

Bahasa pemrosesan string tertentu menawarkan operasi primitif yang membagi string menjadi dua bagian. Karena operasi ini melibatkan menyalin string asli, dibutuhkan n unit waktu untuk string panjang n, terlepas dari lokasi pemotongan. Misalkan, sekarang, Anda ingin memecah string menjadi banyak bagian. Urutan pembuatan jeda dapat mempengaruhi total waktu berjalan. Misalnya, jika Anda ingin memotong string 20-karakter di posisi dan 10 , maka membuat cut pertama di posisi 3 menimbulkan total biaya 20 + 17 = 37 , sementara melakukan posisi 10 pertama memiliki biaya 20 + yang lebih baik 10 = 30310320+17=3720+10=30.

Saya membutuhkan algoritma pemrograman dinamis yang memberikan potongan , menemukan biaya minimum memotong string menjadi potongan-potongan m + 1 .mm+1

Menandai
sumber

Jawaban:

10

Ide dasarnya adalah: Cobalah semua posisi pemangkasan sebagai pilihan pertama, pecahkan masing-masing bagian secara rekursif, tambahkan biaya dan pilih minimum.

Dalam formula:

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

Perhatikan bahwa menerapkan memoisasi untuk rekursi ini sebenarnya menghemat pekerjaan karena mengganti urutan pasangan pemotongan yang diterapkan secara berurutan menghasilkan tiga sub-masalah yang sama yang diselesaikan.

Raphael
sumber
1

Itu selalu merupakan ide yang baik untuk menemukan algoritma rekursif pertama dan kemudian mengubahnya menjadi sebuah tabel.

  1. f(C,n)
  2.   jika (C = ) mengembalikan 0;
  3.   lain
  4.     opt = tak terbatas;
  5.     untuk setiap lakukancC
  6.       D={dC:d<c}
  7.       E={ec:eD,e>c}
  8.       opt=min{opt,f(D,c)+f(E,nc)}
  9.     kembalikan ;opt+n

Jadi Anda mungkin bertanya: tidakkah ada terlalu banyak himpunan bagian C untuk dimasukkan ke dalam tabel? Perhatikan bahwa hanya himpunan bagian berturut-turut yang diperlukan. Dan hanya ada dari mereka (mengapa) Masalah lain adalah:.? Beberapa entri akan mengubah nilai diE. Kita bisa berkeliling dengan menunjukkan awal dan akhir pada masing-masingfdaripada hanya menentukan panjangnya.(n2)Ef

Dimitar Stratiev
sumber
0

Ini sangat mirip dengan Quicksort pada multiset; itu optimal ketika titik potong paling dekat dengan tengah, dan kemudian kita kambuh.

sk

KWillets
sumber