วิธีการแก้ไขปัญหาการเขียนโปรแกรมแบบไดนามิกให้ดีขึ้น


9

ฉันเพิ่งเจอคำถามนี้: "คุณจะได้รับนิพจน์บูลีนประกอบด้วยสตริงของสัญลักษณ์ 'จริง', 'เท็จ', 'และ', 'หรือ' และ 'และ' xor 'นับจำนวนวิธีในการวงเล็บ นิพจน์เช่นนั้นจะประเมินเป็นจริงตัวอย่างเช่นมีสองวิธีในการวงเล็บ 'true และ false xor true' ซึ่งจะประเมินค่าเป็นจริง "

ฉันรู้ว่ามันเป็นปัญหาการเขียนโปรแกรมแบบไดนามิกดังนั้นฉันจึงพยายามหาวิธีแก้ปัญหาด้วยตัวเองซึ่งมีดังต่อไปนี้ สมมติว่าเรามีการแสดงออกเป็น ABC .... D '' ที่ไหน แสดงถึงการดำเนินการใด ๆ และหรือหรือ xor และตัวอักษรพิมพ์ใหญ่แสดงถึงความจริงหรือเท็จ ให้บอกว่าหลายวิธีสำหรับการแสดงออกของขนาด K นี้ที่จะสร้างความจริงคือ N. เมื่อเพิ่มค่าบูลีนใหม่ E ในการแสดงออกนี้มี 2 วิธีในการวงเล็บการแสดงออกใหม่นี้ 1 (ABC .... D) .E) เช่น ด้วยวงเล็บที่เป็นไปได้ทั้งหมดของ ABC .... เราเพิ่ม E ในตอนท้าย 2. (ABC (DE)) เช่น ประเมิน DE ก่อนแล้วจึงหาจำนวนวิธีที่นิพจน์ขนาดนี้ K สามารถสร้างได้จริง

สมมติว่า T [K] เป็นจำนวนวิธีที่นิพจน์ที่มีขนาด K ก่อให้เกิดความจริงแล้ว T [k] = val1 + val2 + val3 โดยที่ val1, val2, val3 ถูกคำนวณดังนี้

1) เมื่อ E ถูกจัดกลุ่มกับ D

i) มันไม่เปลี่ยนค่าของ D

ii) ค่า inverses ของ D

ในกรณีแรก val1 = T [K] = N. (เช่นนี้จะลดการแสดงออกเบื้องต้น ABC ... D) ในกรณีที่สองประเมินอีกครั้ง dp [K] ด้วยค่า D ย้อนกลับและนั่นคือ val1

2) เมื่อ E ถูกจัดกลุ่มด้วยนิพจน์ทั้งหมด

// val2 มีจำนวนของ 'จริง' E จะผลิตโดยมีการแสดงออกซึ่งให้ 'จริง' ในทุกกรณีที่ใส่วงเล็บของ ABC ...... D i) ถ้าเป็นจริง E = จริงแล้ว val2 = N

ii) ถ้าเป็น true.E = false ดังนั้น val2 = 0

// val3 มีจำนวนของ 'จริง' E จะผลิตโดยมีการแสดงออกซึ่งให้ 'เท็จ' ในทุกกรณีวงเล็บของ ABC ...... D

iii) ถ้า false.E = true ดังนั้น val3 = (2 ^ (K-2) - N) = M เช่น จำนวนวิธีที่นิพจน์ที่มีขนาด K ให้ค่าเป็นเท็จ [2 ^ (K-2) คือจำนวนวิธีในการวงเล็บการแสดงออกของขนาด K]

iv) ถ้า false.E = false ดังนั้น val3 = 0

นี่เป็นแนวคิดพื้นฐานที่ฉันมีอยู่ในใจ แต่เมื่อฉันตรวจสอบหาวิธีแก้ปัญหาของมันที่http://people.csail.mit.edu/bdean/6.046/dp/dp_9.swfวิธีการนั้นแตกต่างกันอย่างสิ้นเชิง มีคนบอกฉันว่าฉันทำอะไรผิดและฉันจะแก้ปัญหา DP ได้ดีขึ้นอย่างไรเพื่อที่ฉันจะได้หาวิธีแก้ปัญหาอย่างที่ได้รับมา

ขอบคุณล่วงหน้า.


คำถามนั้นผิด true and (false xor true) = (true and false) xor true(มองเห็นได้ง่ายโดยการลดทั้งสองเป็นfalse xor true)
Peter Taylor

เป็นคำถามที่ดีมาก! ฉันต้องดีขึ้นถึง DP เช่นกัน บางคนบอกว่า "อ่า .. DP เป็นเรื่องเกี่ยวกับการเรียกซ้ำง่าย ๆ " มันไม่ใช่!
Florents Tselai

@Florents Tselai เพิ่งเห็นความคิดเห็นของคุณ ทำไมคุณถึงคิดว่ามันไม่
John Donn

คำตอบ:


9

คำตอบเช่นเดียวกับหลายสิ่งคือ:

ฝึกฝนฝึกฝนฝึกฝน

โดยวิธีการที่ฉันเชื่อว่าในการแก้ปัญหาของคุณคุณเข้าสู่จุดจบโดยทำผิดพลาดเล็กน้อยในช่วงต้น: "มี 2 วิธีในการควบคุมการแสดงออกใหม่นี้" - ไม่ได้มีมากกว่า 2? วิธีการเกี่ยวกับ(A.B.(C.D.E))เช่น?


"ฉันจะทำ X ให้ดีขึ้นได้อย่างไร" - "Do X!" ... ฟังดูสมเหตุสมผล ;-)
Joachim Sauer

2

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

คุณสามารถค้นหาปัญหา spoj ที่เกี่ยวข้องกับการเขียนโปรแกรมแบบไดนามิกได้ที่นี่ :)


โปรดแสดงความคิดเห็นก่อน downvote ดังนั้นฉันสามารถปรับปรุง :)
nischayn22

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