ฉันเพิ่งเจอคำถามนี้: "คุณจะได้รับนิพจน์บูลีนประกอบด้วยสตริงของสัญลักษณ์ 'จริง', 'เท็จ', 'และ', 'หรือ' และ 'และ' 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
)