Abridged Problem Statement
กำหนดตารางสองมิติขนาด แถว คอลัมน์ แต่ละช่องประกอบด้วยลูกแก้วสีแดงหรือเขียวอย่างใดอย่างหนึ่ง ต้องการเดินจากช่องบนซ้ายไปยังล่างขวาโดยเดินได้เพียงทิศลงหรือขวาเท่านั้น โดยเมื่อเดินผ่านแต่ละช่องจะเก็บลูกแก้วหรือไม่ก็ได้ ถามว่าจะเก็บได้อย่างมากที่สุดกี่ลูกโดยที่ทั้งสองสีนั้นจะต้องเท่ากัน และจะต้องเดินอย่างไร เก็บอย่างไร
Subtask 1
ทดลองเดินทุกแบบที่เป็นไปได้ ทั้งหมด วิธี ซึ่งจะได้ไม่เกิน วิธีหากยึดตามข้อจำกัดของปัญหาย่อยนี้แต่ละวิธี ไล่หาทุกวิธีการเลือกที่เป็นไปได้ มีทั้งหมด วิธี ซึ่งจะได้ไม่เกิน วิธีตามข้อจำกัดของปัญหาย่อย นี้
Time Complexity:
Subtask 2-3
เราจะใช้วิธีการ Dynamic Programming โดยพิจารณาว่า สำหรับการเดินจากช่องบนซ้าย มาจนถึงช่องที่ ใด ๆ โดยที่หยิบลูกแก้วสีแดงไปแล้ว ลูก และหยิบลูกแก้วสีเขียวไปแล้ว ลูก ทำได้หรือไม่ และหากทำได้ ถือว่าคำนวณจากการเดิน state ก่อนหน้าในช่องใด เราจะแทนค่านี้ด้วยตัวแปร (มีวิธีการเขียนหลายแบบ วิธีหนึ่งคือมองว่า จะเป็น
- เมื่อไม่สามารถทำให้เกิด state ดังกล่าวได้
- หากสามารถเกิดได้จาก หรือ
- หากสามารถเกิดได้จาก หรือ
เมื่อ แทนจำนวนลูกแก้วไม่รวมช่อง
หากนิยาม state ของ Dynamic Programming ว่าเป็นจริงก็ต่อเมื่อช่องปัจจุบันเป็นช่องที่ถูกเลือก การย้าย state จะใช้เวลา ทำให้ได้เวลารวม
หากพัฒนาขึ้นมาเรื่อย ๆ จนได้นิยามดังที่กล่าวข้างต้น จะใช้เวลา
Time Complexity:
Subtask 4
ต่อจากปัญหาย่อยที่ผ่านมา แทนที่จะเก็บค่าทั้ง และ เราจะเก็บค่าผลต่างแทน กล่าวคือเก็บค่า พร้อมทั้งข้อมูล ภายใน state จะได้เป็น เมื่อ เป็น ตามที่นิยามในปัญหาย่อยก่อนหน้า หากมี ที่เป็นไปได้หลายค่าสำหรับ state เดียวกัน จะพิจารณาตามค่าที่มากที่สุดที่เป็นไปได้ และการหาคำตอบก็ใช้วิธี backtrack แบบเดียวกับปัญหาย่อยก่อนหน้า
Time Complexity:
Subtask 5
เนื่องจากวิธีการเดินมีได้เพียงแบบเดียว เราสามารถพิจารณาเพียงแค่ว่าจะหยิบลูกแก้วตำแหน่งใดบ้าง ซึ่งจะได้ว่าคำตอบเป็น เมื่อ แทนจำนวนลูกแก้วสีแดงและสีเขียวทั้งหมด ตามลำดับ สังเกตว่าการหยิบลูกแก้วสีเดียวกัน ไม่ว่าจะหยิบตำแหน่งใดก็ไม่สำคัญ เราจึงสามารถหยิบไปเรื่อย ๆ จนได้ค่าดังกล่าว
Time Complexity:
Subtask 6
แยกเป็นสองแถว สิ่งที่จำเป็นต้องเก็บสำหรับแถวแรก คือข้อมูลว่าหากเดินไปทางขวาเรื่อย ๆ ถึงคอลัมน์ที่ แล้วจะเก็บลูกแก้วสีแดงและเขียวได้มากที่สุดกี่ลูก นิยามเป็น ตามลำดับ สำหรับแถวที่สอง เก็บจากคอลัมน์ที่ มาถึงคอลัมน์ที่ นิยามเป็น คำตอบทุกคำตอบที่เป็นไปได้ จะต้องมีการเปลี่ยนจากแถวแรกไปยังแถวที่สอง ในบางตำแหน่ง (เรียกตำแหน่งนั้นว่า ) คำตอบที่ดีที่สุดเกิดขึ้นเมื่อ มีค่ามากที่สุด เราทำการไล่ค่าทุก ตั้งแต่ ถึง แล้วหาค่าที่มากที่สุดที่เป็นไปได้ หลังจากนั้นจะสามารถแก้ได้หาวิธีการเดินได้แบบเดียวกับปัญหาย่อย 5
Time Complexity:
Subtask 7
เราจะพิจารณาข้อสังเกตบางข้อเพิ่มเติมดังนี้
ข้อสังเกต. การเดินทางจากช่องบนซ้ายไปยังขวาล่าง โดยเดินได้เพียงแค่ไปทางขวากับลงล่างนั้น จะเดินผ่านทั้งหมด ช่องพอดี และเนื่องจากผ่านทั้งหมด ช่อง หากบังคับว่าเมื่อเดินผ่านทุกช่องแล้วจะต้องเก็บทุกช่อง และเก็บลูกแก้วสีแดงได้ทั้งหมด ลูก แล้วจะได้ว่าเก็บลูกแก้วสีเขียวได้ ลูก
ต่อมาเราจึงพิจารณาเส้นทางเส้นหนึ่งที่เป็นไปได้ สมมติว่ามีลูกแก้วสีแดง ลูก และมีลูกแก้วสีเขียว ลูก คำตอบที่ดีที่สุดที่จะได้จากการเดินบนเส้นทางนี้คือ พอดี จากจุดนี้เราสามารถดัดแปลงโจทย์ให้ง่ายลง แต่มีคำตอบเหมือนโจทย์เดิม ได้ว่า: สำหรับทุกเส้นทางเราจะหยิบลูกแก้วทุกลูกที่เดินผ่าน แล้วพิจารณาค่าของเส้นทางเป็น เมื่อ แทนจำนวนลูกแก้วสีแดงบนเส้นทางนั้น ต่อมา สังเกตข้อสังเกตเพิ่มเติมดังนี้
ข้อสังเกต (Intermediate Value Theorem). หากมีเส้นทางอย่างน้อยเส้นหนึ่งที่เมื่อเก็บลูกแก้วสีแดงทุกลูกที่อยู่บนเส้นทางนั้นแล้วได้เป็นค่า และมีอีกเส้นทางหนึ่งที่ เมื่อเก็บลูกแก้วสีแดงทุกลูกบนเส้นนั้นเช่นกันแล้วได้เป็นค่า โดยที่ จะได้ว่า สำหรับทุก ๆ ที่ จะมีเส้นทางอย่างน้อยหนึ่งเส้นทางที่ทำให้ได้ลูกแก้วสีแดง จำนวน R' ลูกพอดีเมื่อหยิบทุกลูกบนเส้นนี้
ทฤษฎีบทข้างต้นสามารถพิสูจน์ได้ด้วยการอุปนัยเชิงคณิตศาสตร์ การพิสูจน์นี้ถือเป็นแบบฝึกหัดสำหรับผู้อ่าน
เมื่อข้อสังเกตข้างต้นเป็นทฤษฎีบทที่เป็นจริง เราจึงปรับนิยามของ Dynamic Programming จากปัญหาย่อย 4 จากที่ เป็น กลายเป็น เก็บว่าสามารถหยิบลูกแก้วสีแดงได้ค่าเท่าใดบ้างหากบังคับว่าหยิบทุกลูกจากจุดเริ่มต้นจนถึงช่องปัจจุบัน เนื่องจากมีได้หลายค่าแต่ทฤษฎีบทข้างต้นเป็นจริง จึงได้ว่าเราจำเป็นต้องเก็บเพียงค่าที่น้อยที่สุดและมากที่สุดที่เป็นไปได้ ตามลำดับ (ค่าระหว่างนั้นทุกค่าจะเป็นไปได้เสมอ)
เมื่อถึงช่องในแถวที่ คอลัมน์ที่ แล้ว จะได้ค่า เป็นช่วง ๆ หนึ่ง เราต้องการหาค่าสูงสุดของฟังก์ชัน สำหรับ ที่อยู่ภายในช่วงนี้ (ฟังก์ชันนี้แทนการคำนวณคะแนนจากจำนวนลูกแก้วสีแดงที่มีอยู่)
ข้อสังเกต. ฟังก์ชัน นิยามโดย มีจุดสูงสุดอยู่ที่ จึงได้ว่าฟังก์ชันที่คล้ายกัน (เรียกเป็น นิยามโดย ก็มีจุดสูงสุดอยู่ที่ หาก เป็นจำนวนเต็มคู่ แต่จะมีจุดสูงสุดอยู่สองจุดที่ และ หาก เป็นจำนวนเต็มคี่
หลังจากนี้เราจึงสามารถหาคำตอบโดยการแยกกรณี เป็นจำนวนเต็มคู่/คี่ แล้วแยกกรณีต่อว่าช่วงของ ที่เป็นไปได้นั้นครอบคลุมจุดสูงสุดหรือไม่
ข้อสังเกต. เมื่อ แทนค่า ที่ทำให้ มีค่าสูงสุด หากมีหลายค่าจะแทนด้วยค่าต่ำสุดที่เป็นไปได้
ในทำนองเดียวกันสำหรับ เมื่อ แทนค่า ที่ทำให้ มีค่าสูงสุด หากมีหลายค่าจะแทนด้วยค่าสูงสุดที่เป็นไปได้
ข้อสังเกตข้างต้นสามารถได้จากการสังเกตลักษณะของฟังก์ชัน ที่นิยามไว้ข้างต้น และสามารถพิสูจน์ทางคณิตศาสตร์ ได้โดยตรง
สำหรับกรณีที่ช่วงคำตอบของ R ครอบคลุม เราสามารถตอบได้ทันที แต่ถ้าหากไม่คลุมจุดดังกล่าว จะแยกได้ กรณีคือกรณีที่ทั้งช่วงน้อยกว่า และกรณีที่ทั้งช่วงมากกว่า แล้วคำนวณค่าคำตอบที่ดีที่สุดจากข้อสังเกตข้างต้น
สำหรับการย้อนรอยหาคำตอบนั้น สามารถทำได้โดยพิจารณาว่าค่า ที่ใช้นั้น มาจากส่วนใดของช่วง แล้วพิจารณาว่าควรย้อนไปในทิศทางใด ทำคล้ายปัญหาย่อยที่ผ่านมา