ข้อนี้มีภารกิจ ภารกิจ โดยต้องทำทุกภารกิจเพียงแต่ต้องเลือกลำดับที่จะทำ
หากทำภารกิจที่ เป็นลำดับที่ จะมีโอกาสสำเร็จ โจทย์ถามว่าผลคูณความน่าจะเป็นเหล่านี้ที่เป็นไปได้มากสุดคือเท่าไหร่
แนวคิด
ข้อนี้เป็นโจทย์ Bitmask Dynamic Programming นั่นคือเป็นโจทย์ Dynamic Programming ที่เก็บ State เป็น Bitmask
สังเกตว่าเราสามารถเก็บคำตอบของแต่ละ State เป็น ซึ่งแทนผลคูณความน่าจะเป็นที่จะสำเร็จโดยที่ภารกิจที่สำเร็จแล้วคือ เมื่อ State เป็นเลขฐานสองโดยที่ ถ้าเราทำภารกิจที่ แล้ว คำตอบจะเป็น เพราะ (มี 1 ตัว)
เช่นถ้า แสดงว่าทำภารกิจที่ 2 กับ 4 แล้ว
สังเกตว่าสำหรับ State จำนวนภารกิจที่ทำไปแล้วจะเท่ากับจำนวน bit ที่เป็น ให้จำนวนนี้เป็น
สำหรับ สามารถตั้งเป็น 100 แทนโอกาส 100%
ในการคำนวณ สังเกตว่าจะต้องมีงานอันภารกิจ ที่ ใน ดังนั้นสามารถพิจารณาทีละงาน ดังกล่าวว่าผลคูณที่ดีที่สุดที่เป็นไปได้คือเท่าไหร่ ซึ่งจะได้ว่าเป็น นั่นคือผลคูณของความน่าจะเป็นเมื่อทำงาน เป็นลำดับที่ กับผลคูณความน่าจะเป็นที่มากสุดที่เป็นไปได้สำหรับ (ซึ่งเป็น State ก่อนทำภารกิจที่ )
ดังนั้นสำหรับแต่ละ หากมีค่า แล้วจะใช้เวลาคำนวณเพียง เมื่อพิจารณาทีละภารกิจ
ดังนั้นเมื่อต้องพิจารณา State เวลาทั้งหมดที่ใช้คือ
ตัวอย่างโค้ด
dp[0] = 100.0; for (int s = 1; s <= ((1 << n) - 1); s++) { int i = 0; for (int j = 0; j < n; j++) i += (((1 << j) & s) != 0); dp[s] = 0; for (int j = 0; j < n; j++) if (((1 << j) & s) != 0) dp[s] = max(dp[s], dp[s ^ (1 << j)] * a[i - 1][j] / 100.0); }
ตามคำอธิบายสำหรับแต่ละ จะนับจำนวนภารกิจที่สำเร็จแล้วใน State จากนั้นจะไล่ภารกิจที่สำเร็จใน ว่าควรทำอันไหนเป็นลำดับที่