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

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.


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


0

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

sk

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.