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