การฝึกเขียนโปรแกรมแบบไดนามิกบนสตริงการตัด


16

ฉันทำงานเกี่ยวกับปัญหาต่อไปนี้จากหนังสือเล่มนี้

ภาษาการประมวลผลสตริงที่แน่นอนมีการดำเนินการดั้งเดิมซึ่งแยกสตริงออกเป็นสองชิ้น เนื่องจากการดำเนินการนี้เกี่ยวข้องกับการคัดลอกสตริงดั้งเดิมจึงใช้เวลา n หน่วยสำหรับสตริงที่มีความยาว n โดยไม่คำนึงถึงตำแหน่งของการตัด สมมติว่าตอนนี้คุณต้องการแบ่งสตริงออกเป็นหลาย ๆ ส่วน ลำดับการหยุดพักอาจส่งผลต่อเวลาการทำงานทั้งหมด ตัวอย่างเช่นหากคุณต้องการตัดสตริงอักขระ 20 ตัวที่ตำแหน่ง3และ10ดังนั้นการตัดครั้งแรกที่ตำแหน่ง3จะมีค่าใช้จ่ายรวม20+17=37ขณะทำตำแหน่ง 10 ก่อนจะมีต้นทุนที่ดีกว่า20+10=30.

ฉันต้องการอัลกอริธึมการเขียนโปรแกรมแบบไดนามิกที่ให้การตัดค้นหาค่าใช้จ่ายขั้นต่ำของการตัดสตริงเป็นm + 1ชิ้นม.ม.+1

คำตอบ:


10

แนวคิดพื้นฐานคือ: ลองตำแหน่งที่ตัดทั้งหมดเป็นตัวเลือกแรกแก้ปัญหาส่วนที่ซ้ำ ๆ เพิ่มต้นทุนและเลือกขั้นต่ำ

ในสูตร:

Mino(s,)={|s|,||=1|s|+นาที[Mino(s1,,{'|'<}) + Mino(s+1,|s|,{'-|'>})], อื่น

โปรดทราบว่าการใช้memoisationกับการเรียกซ้ำนี้จริง ๆ แล้วบันทึกงานตามการสลับคำสั่งของคู่ของการตัดที่ใช้อย่างต่อเนื่องผลลัพธ์ในสามปัญหาย่อยเดียวกันจะถูกแก้ไข


1

เป็นความคิดที่ดีเสมอในการค้นหาอัลกอริทึมแบบเรียกซ้ำก่อนแล้วจึงเปลี่ยนเป็นตาราง

  1. (,n)
  2.   ถ้า (C = ) ส่งคืน 0;
  3.   อื่น
  4.     opt = อนันต์
  5.     สำหรับแต่ละทำ
  6.       D={d:d<}
  7.       E={อี-:อีD,อี>}
  8.       โอพีเสื้อ=ม.ผมn{โอพีเสื้อ,(D,)+(E,n-)}
  9.     ส่งคืน ;โอพีเสื้อ+n

ดังนั้นคุณอาจถามว่า: ไม่มีเซตย่อย C มากเกินไปที่จะใส่ในตารางหรือไม่ สังเกตว่าจำเป็นต้องใช้ชุดย่อย 'ต่อเนื่อง' เท่านั้น และมีเพียง . ของพวกเขา (ทำไม) ปัญหาก็คือ: บางรายการจะมีการเปลี่ยนแปลงค่าในE เราสามารถเดินไปรอบ ๆ นี้โดยระบุเริ่มต้นและสิ้นสุดในแต่ละมากกว่าแค่การระบุความยาว(n2)E


0

สิ่งนี้คล้ายกับ Quicksort บนมัลติเซ็ต จะดีที่สุดเมื่อจุดตัดอยู่ใกล้กับตรงกลางมากที่สุดจากนั้นเราจะทำการคืนค่า

sk

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.