คำถามติดแท็ก dynamic-programming

คำถามเกี่ยวกับปัญหาที่สามารถแก้ไขได้โดยการรวมวิธีแก้ปัญหาย่อยที่ได้รับซ้ำ ๆ

3
ปัญหาเครื่องเป้น - NP-complete แม้จะมีวิธีการเขียนโปรแกรมแบบไดนามิก?
ปัญหาเครื่องหลังสามารถแก้ไขได้อย่างง่ายดายโดยการตั้งโปรแกรมแบบไดนามิก การเขียนโปรแกรมแบบไดนามิกทำงานในเวลาพหุนาม นั่นคือเหตุผลที่เราทำเช่นนั้นใช่ไหม ฉันได้อ่านแล้วมันเป็นปัญหา NP-complete ซึ่งหมายความว่าการแก้ปัญหาในปัญหาพหุนามอาจเป็นไปไม่ได้ ความผิดพลาดของฉันอยู่ที่ไหน

3
การตัดสินใจเกี่ยวกับปัญหาย่อยสำหรับการเขียนโปรแกรมแบบไดนามิก
ฉันได้ใช้เทคนิคการเขียนโปรแกรมแบบไดนามิกหลายครั้ง แต่วันนี้เพื่อนถามฉันว่าฉันจะกำหนดปัญหาย่อยของฉันได้อย่างไรฉันรู้ว่าฉันไม่มีวิธีให้คำตอบอย่างเป็นทางการ คุณจะกำหนดปัญหาย่อยอย่างเป็นทางการสำหรับปัญหาที่คุณจะแก้ไขโดยใช้การเขียนโปรแกรมแบบไดนามิกได้อย่างไร

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

4
การเขียนโปรแกรมแบบไดนามิกเกี่ยวกับอะไร?
ขออภัยล่วงหน้าหากคำถามนี้ฟังดูเป็นใบ้ ... เท่าที่ฉันรู้การสร้างอัลกอริทึมโดยใช้การเขียนโปรแกรมแบบไดนามิกทำงานในลักษณะนี้: แสดงปัญหาว่าเป็นความสัมพันธ์ที่เกิดซ้ำ; ใช้ความสัมพันธ์ที่เกิดซ้ำทั้งผ่านการบันทึกและผ่านวิธีการจากล่างขึ้นบน เท่าที่ฉันรู้ฉันได้กล่าวทุกอย่างเกี่ยวกับการเขียนโปรแกรมแบบไดนามิก ฉันหมายถึง: การเขียนโปรแกรมแบบไดนามิกไม่ได้ให้เครื่องมือ / กฎ / วิธีการ / ทฤษฎีบทสำหรับการแสดงความสัมพันธ์ที่เกิดขึ้นอีกหรือเปลี่ยนเป็นรหัส ดังนั้นมีอะไรพิเศษเกี่ยวกับการเขียนโปรแกรมแบบไดนามิก? มันให้อะไรคุณนอกจากวิธีคลุมเครือสำหรับการเข้าใกล้ปัญหาบางประเภท?

5
ความแตกต่างในการเขียนโปรแกรมแบบไดนามิก: ตัวอย่างที่จำเป็น!
ฉันทำงานเกี่ยวกับการเขียนโปรแกรมแบบไดนามิกมาระยะหนึ่งแล้ว วิธีบัญญัติของการประเมินการเรียกใช้การเขียนโปรแกรมแบบไดนามิกคือการสร้างตารางของค่าที่จำเป็นทั้งหมดและกรอกข้อมูลทีละแถว ดูตัวอย่างจากCormen, Leiserson และ al: "Introduction to Algorithms"สำหรับการแนะนำ ฉันมุ่งเน้นที่รูปแบบการคำนวณบนโต๊ะในสองมิติ (การกรอกข้อมูลแบบแถวต่อแถว) และตรวจสอบโครงสร้างของการพึ่งพาเซลล์นั่นคือเซลล์ใดที่ต้องทำก่อนที่จะคำนวณอื่นได้ เราแสดงด้วยชุดของดัชนีของเซลล์ที่เซลล์ของฉันขึ้นอยู่กับ โปรดทราบว่าΓจะต้องไม่มีรอบΓ(i)Γ(i)\Gamma(\mathbf{i})ii\mathbf{i}ΓΓ\Gamma ฉันสรุปจากฟังก์ชันจริงที่คำนวณและมีสมาธิกับโครงสร้างแบบเรียกซ้ำ อย่างเป็นทางการผมพิจารณา recurrrence ที่จะเขียนโปรแกรมแบบไดนามิกถ้ามันมีรูปแบบddd d(i)=f(i,Γ˜d(i))d(i)=f(i,Γ~d(i))\qquad d(\mathbf{i}) = f(\mathbf{i}, \widetilde{\Gamma}_d(\mathbf{i})) กับ , ~ Γ d ( ฉัน ) = { ( J , d ( ญ ) ) | เจ ∈ Γ d ( ฉัน ) }และฉบางคน …

6
การเขียนโปรแกรมแบบไดนามิกแตกต่างจากแรงเดรัจฉานอย่างไร
ฉันอ่านเกี่ยวกับการเขียนโปรแกรมแบบไดนามิกเมื่อฉันเจอข้อความอ้างอิงต่อไปนี้ อัลกอริทึมการเขียนโปรแกรมแบบไดนามิกจะตรวจสอบวิธีที่เป็นไปได้ทั้งหมดในการแก้ปัญหาและจะเลือกทางออกที่ดีที่สุด ดังนั้นเราจึงสามารถคิดคร่าว ๆ ของการเขียนโปรแกรมแบบไดนามิกเป็นอัจฉริยะวิธีแรงเดรัจฉานที่ช่วยให้เราไปถึงการแก้ปัญหาที่เป็นไปได้ทั้งหมดในการเลือกที่ดีที่สุด หากขอบเขตของปัญหาเป็นเช่นนั้นที่จะผ่านการแก้ไขปัญหาที่เป็นไปได้ทั้งหมดและเป็นไปได้อย่างรวดเร็วพอการเขียนโปรแกรมแบบไดนามิกรับประกันการหาทางออกที่ดีที่สุด ตัวอย่างต่อไปนี้ได้รับ ตัวอย่างเช่นสมมติว่าคุณต้องได้รับจากจุด A ถึงจุด B โดยเร็วที่สุดในเมืองที่กำหนดในช่วงชั่วโมงเร่งด่วน อัลกอริทึมการเขียนโปรแกรมแบบไดนามิกจะตรวจสอบรายงานการจราจรทั้งหมดโดยดูจากชุดค่าผสมที่เป็นไปได้ทั้งหมดของถนนที่คุณอาจจะใช้แล้วจะบอกให้คุณทราบว่าวิธีใดเป็นวิธีที่เร็วที่สุด แน่นอนว่าคุณอาจต้องรอสักครู่จนกว่าอัลกอริทึมจะเสร็จสิ้นและจากนั้นจึงเริ่มขับรถเท่านั้น เส้นทางที่คุณจะใช้จะเป็นเส้นทางที่เร็วที่สุด (สมมติว่าไม่มีอะไรเปลี่ยนแปลงในสภาพแวดล้อมภายนอก) Brute Force กำลังพยายามแก้ปัญหาที่เป็นไปได้ก่อนตัดสินใจเลือกทางออกที่ดีที่สุด การเขียนโปรแกรมแบบไดนามิกแตกต่างจาก Brute Force อย่างไรหากผ่านโซลูชั่นที่เป็นไปได้ทั้งหมดก่อนที่จะเลือกสิ่งที่ดีที่สุดความแตกต่างเดียวที่ฉันเห็นคือการเขียนโปรแกรมแบบไดนามิกคำนึงถึงปัจจัยเพิ่มเติม (สภาพการจราจรในกรณีนี้) ฉันถูกต้องหรือไม่ที่จะบอกว่า Dynamic Programming เป็นส่วนหนึ่งของวิธี Brute Force?

3
ผลรวมที่ใหญ่ที่สุดหารด้วย n
ฉันถามคำถามนี้กับ StackOverflowแต่ฉันคิดว่าที่นี่เป็นสถานที่ที่เหมาะสมกว่า นี่เป็นปัญหาจากหลักสูตรIntroduction to Algorithm : คุณมีอาร์เรย์aaaพร้อมnnnจำนวนเต็มบวก (อาร์เรย์ไม่จำเป็นต้องเรียงหรือองค์ประกอบที่ไม่ซ้ำกัน) แนะนำให้O(n)O(n)O(n)ขั้นตอนวิธีการที่จะหาผลรวมที่ใหญ่ที่สุดขององค์ประกอบที่หารด้วยnnnn ตัวอย่าง: = [ 6 , 1 , 13 , 4 , 9 , 8 , 25 ] , n = 7 คำตอบคือ56 (มีองค์ประกอบ6 , 13 , 4 , 8 , 25 )a=[6,1,13,4,9,8,25],n=7a=[6,1,13,4,9,8,25],n=7a = [6, 1, 13, 4, 9, 8, 25], n …

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

3
การบันทึกโดยไม่มีอาร์เรย์
ในบทนำสู่อัลกอริทึมของ Cormen และคณะส่วนที่ 15.3 องค์ประกอบของการเขียนโปรแกรมแบบไดนามิกจะอธิบายการบันทึกความจำดังนี้ อัลกอริทึมแบบเรียกซ้ำที่บันทึกช่วยเก็บรักษารายการในตารางสำหรับการแก้ปัญหาสำหรับแต่ละปัญหาย่อย แต่ละรายการในตารางเริ่มต้นมีค่าพิเศษเพื่อระบุว่ารายการยังไม่ได้กรอกเมื่อพบปัญหาย่อยเป็นครั้งแรกในขณะที่อัลกอริทึมแบบเรียกซ้ำเกิดขึ้นการแก้ปัญหาของมันจะถูกคำนวณและจัดเก็บในตาราง ในแต่ละครั้งที่เราพบปัญหาย่อยนี้เราเพียงค้นหาค่าที่เก็บไว้ในตารางและส่งคืน และเพิ่มเป็นเชิงอรรถ: วิธีการนี้อนุมานว่าเรารู้ชุดของพารามิเตอร์ย่อยที่เป็นไปได้ทั้งหมดและเราได้สร้างความสัมพันธ์ระหว่างตำแหน่งของตารางและปัญหาย่อย อีกวิธีที่ทั่วไปกว่าคือการบันทึกโดยใช้การแฮชด้วยพารามิเตอร์ย่อยเป็นคีย์ มีปัญหา DP ที่มีความรู้ที่ต้องการ (หรือทำให้ง่ายขึ้น) ในการจัดเก็บค่าที่บันทึกในพจนานุกรมแทนที่จะเป็นในอาร์เรย์ (หลายมิติ) หรือไม่? ข้อมูลประกอบ: หากนี่เป็นการใช้งานใด ๆ เหตุผลสำหรับคำถามนี้คือฉันพยายามกระตุ้นความคิดของแผนภูมิการค้นหาแบบไบนารี (สมดุลตนเอง) แก่ผู้ที่เพิ่งเห็นการเขียนโปรแกรมแบบไดนามิก

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

2
การคูณเมทริกซ์โซ่และการยกกำลัง
ถ้าฉันมีเมทริกซ์และสองขนาดและตามลำดับและต้องการคำนวณมันมีประสิทธิภาพมากกว่าที่จะเขียนนิพจน์ใหม่เป็นและเพียงแล้วประเมินตัวเลขเพราะเป็นมิติแต่เป็นของมิติ2B 1,000 × 2 2 × 1,000 ( A B ) 5,000 A ( B A ) 4999 B A B 1,000 × 1000 B A 2 × 2AAABBB1000×21000×21000\times22×10002×10002\times1000(AB)5000(AB)5000(AB)^{5000}A(BA)4999BA(BA)4999BA(BA)^{4999}BABABAB1000×10001000×10001000\times1000BABABA2×22×22\times2 ฉันต้องการแก้ปัญหานี้โดยทั่วไป มีอัลกอริธึมที่มีประสิทธิภาพพอสมควร (ไม่ใช่แรงเดรัจฉาน) เพื่อปรับการแสดงออกที่มี: ตัวแปรเมทริกซ์อิสระของขนาดที่รู้จัก ผลิตภัณฑ์ของ subexpressions โดยพลการ subexpressions โดยพลการยกกำลังธรรมชาติ ... เพื่อที่จะใช้เวลาน้อยที่สุดในการประเมินตัวเลขหลังจากการแทนที่ตัวแปรเมทริกซ์อิสระด้วยค่าเมทริกซ์คอนกรีต? ห่วงโซ่คูณเมทริกซ์ปัญหาเป็นกรณีพิเศษของปัญหาของฉัน แก้ไข: นี่คือคำตอบเบื้องต้น ดูเหมือนว่าเหมาะสมกับฉัน แต่ฉันก็ไม่มีข้อพิสูจน์ว่าถูกต้อง หากปรากฎว่าถูกต้องฉันยังคงสนใจในการพิสูจน์ (หากมันไม่ถูกต้องแน่นอนโปรดแก้ไขให้ถูกต้อง) สำหรับทุกผลิตภัณฑ์ที่ยกระดับพลังงานให้พูดว่าให้พิจารณาการเปลี่ยนรูปแบบวนรอบของปัจจัยทั้งหมด:(A1A2…Ak)n(A1A2…Ak)n(A_1 A_2 …

2
โปรแกรม Word ตัวประกอบใน
รับสองสตริงS1,S2S1,S2S_1, S_2เราเขียนS1S2S1S2S_1S_2สำหรับการต่อกัน ได้รับสตริงSSSและจำนวนเต็มk≥1k≥1k\geq 1เราเขียน(S)k=SS⋯S(S)k=SS⋯S(S)^k = SS\cdots Sสำหรับการเรียงต่อกันของkkkสำเนาของSSSSตอนนี้รับสายเราสามารถใช้สัญกรณ์นี้เพื่อ 'บีบอัด' มันคือAABAABAABAABAABAABอาจจะเขียนเป็น((A)2B)2((A)2B)2((A)^2 B)^2 . ลองเรียกน้ำหนักของการบีบอัดตามจำนวนตัวอักษรที่ปรากฏในนั้นดังนั้นน้ำหนักของ((A)2B2)((A)2B2)((A)^2 B^2)คือสองและน้ำหนักของ(AB)2A(AB)2A(AB)^2 A (การบีบอัดของABABAABABAABABA ) คือสาม (AAAแยกต่างหากจะนับแยกต่างหาก) ตอนนี้ให้พิจารณาปัญหาของการคำนวณการบีบอัด 'เบาที่สุด' ของสตริงSSSด้วย|S|=n|S|=n|S|=n n หลังจากคิดว่ามีวิธีการเขียนโปรแกรมแบบไดนามิกที่ชัดเจนซึ่งทำงานในO(n3logn)O(n3log⁡n)O(n^3 \log n)หรือO(n3)O(n3)O(n^3)ขึ้นอยู่กับวิธีที่แน่นอน อย่างไรก็ตามฉันได้รับแจ้งว่าปัญหานี้สามารถแก้ไขได้ในเวลาO(n2logn)O(n2log⁡n)O(n^2 \log n)แม้ว่าฉันจะไม่สามารถหาแหล่งข้อมูลเกี่ยวกับวิธีการทำเช่นนี้ได้ ปัญหานี้ได้รับจากการประกวดการเขียนโปรแกรมเมื่อเร็ว ๆ นี้ (ปัญหา K ที่นี่สองหน้าสุดท้าย) ในระหว่างการวิเคราะห์อัลกอริทึมO(n3logn)O(n3log⁡n)O(n^3 \log n)ถูกนำเสนอและในตอนท้ายกล่าวถึงขอบเขตกำลังสองหลอก ( ที่นี่ที่เครื่องหมายสี่นาที) น่าเสียดายผู้นำเสนอเพียงเรียกว่า 'คำศัพท์ที่ซับซ้อน combinatorics lemma' ดังนั้นตอนนี้ฉันมาที่นี่เพื่อขอคำตอบ :-)

1
ความแตกต่างของปัญหาเป้สะพายหลัง
คุณจะเข้าหาปัญหาเป้ในสถานการณ์การเขียนโปรแกรมแบบไดนามิกได้อย่างไรถ้าตอนนี้คุณต้อง จำกัด จำนวนของสินค้าในเป้หลังด้วยค่าคงที่ ? นี่เป็นปัญหาเดียวกัน (น้ำหนักสูงสุดของทุกรายการมีค่าและน้ำหนัก ) แต่คุณสามารถเพิ่มเฉพาะรายการไปยังเป้และเห็นได้ชัดว่าจำเป็นต้องปรับค่าของเป้ให้เหมาะสมpppWWWvvvwwwppp เราจำเป็นต้องมีมิติที่ 3 หรือเราสามารถหาวิธีอื่นได้โดยไม่ต้องใช้มัน ฉันพยายามที่จะเพิ่มจำนวนรายการในเป้ในเซลล์และรับค่าสูงสุดในตอนท้ายด้วยจำนวนรายการ <=แต่มันไม่ใช่ทางออกที่ดีที่สุดppp

2
การเขียนโปรแกรมแบบไดนามิกที่มีปัญหาย่อยจำนวนมาก
การเขียนโปรแกรมแบบไดนามิกที่มีปัญหาย่อยจำนวนมาก ดังนั้นฉันพยายามแก้ไขปัญหานี้จาก Interview Street: ตารางเดิน (คะแนน 50 คะแนน) คุณกำลังตั้งอยู่ในตารางมิติที่ตำแหน่งX_n) ขนาดของกริดคือ ) ในขั้นตอนเดียวคุณสามารถเดินไปข้างหน้าหรือข้างหลังหนึ่งก้าวในมิติใด ๆ ก็ได้ (ดังนั้นจะมีการเคลื่อนไหวต่าง ๆ ที่เป็นไปได้เสมอ) คุณสามารถทำตามขั้นตอนหลายวิธีเช่นนี้โดยที่คุณไม่ออกจากกริดในทุกจุด คุณออกจากตารางถ้าใด ๆทั้งหรือD_i( x 1 , x 2 , … , x N ) ( D 1 , D 2 , … , D N N 2 N M x ฉันx ฉัน ≤ …

1
นี่อาจเป็นปัญหา NP-Complete หรือไม่
พิจารณาข้อความสั่งปัญหาต่อไปนี้: เมื่อให้หมายเลขเริ่มต้นคุณและเพื่อนของคุณจะผลัดกันลบสแควร์ที่สมบูรณ์แบบจากนั้น คนแรกที่ได้เป็นศูนย์ชนะ ตัวอย่างเช่น: สถานะเริ่มต้น: 37 ผู้เล่น 1 ลบออก 16 สถานะ: 21 ผู้เล่น 2 ลบ 8. สถานะ: 13 ผู้เล่น 1 หักออก 4. สถานะ: 9 ผู้เล่น 2 ลบ 9. สถานะ: 0 ผู้เล่น 2 ชนะ! เขียนโปรแกรมที่ให้สถานะเริ่มต้นคืนค่าการย้ายที่ดีที่สุดเช่นที่รับประกันว่าจะนำไปสู่การชนะเกม หากไม่มีการเคลื่อนไหวที่เป็นไปได้สามารถนำคุณไปสู่สถานะที่ชนะได้ให้กลับ -1 ปัญหานี้สามารถแก้ไขได้ในเวลาเทียม - พหุนามโดยใช้การเขียนโปรแกรมแบบไดนามิก แนวความคิดนี้เป็นเพียงการเติมความยาวของอาร์เรย์n (โดยที่nคือสถานะเริ่มต้น) ขึ้นด้านล่างด้วยการเคลื่อนไหวที่ดีที่สุดหรือ -1 หากไม่มีการเคลื่อนไหวใดที่นำไปสู่การชนะ นี่จะใช้ O (n * sqrt (n)) …

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