ในข้อนี้ เราต้องการเลือกจุดสามจุดบนเส้นจำนวน ที่ผลรวมค่าความอร่อยของขนมที่สัมผัสกับจุดสามจุดนี้มีค่ามากที่สุด (ขนมมีทั้งหมด เส้น เส้นที่ วางอยู่ ณ ตำแหน่ง ถึง )
เราจะใช้ Dynamic Programming ในการแก้ข้อนี้ โดยกำหนดให้ เป็นผลรวมค่าความอร่อยของขนมที่สัมผัสกับจุดบนเส้นจำนวนที่ได้เลือกเอาไว้ จุด โดยจุดที่ จะอยู่ที่ตำแหน่ง (ส่วนจุดอื่น ๆ อยู่ก่อนหน้าตำแหน่ง )
หากเรากำหนดให้ Recurrence Formula เป็น
กล่าวคือคำนวณ โดยนำผลรวมค่าความอร่อยที่มากที่สุดเมื่อเลือกไปแล้ว บวกกับขนมที่สัมผัสตำแหน่ง วิธีนี้จะเกิดปัญหาเพราะขนมที่สัมผัสกับ นั้น อาจสัมกับจุดที่ได้เลือกไว้ จุดก่อนหน้าแล้ว ทำให้คำนวณค่าความอร่อยของขนมชิ้นนั้นซ้ำ เราจึงต้องแก้ปัญหาโดยคำนวณค่าของ ด้วยวิธีดังต่อไปนี้
- กำหนดให้ ซึ่งเป็น Base Case
- พิจารณา ตามลำดับ
- สำหรับแต่ละ เราจะทำ Operation ดังต่อไปนี้
เมื่อ และ
- กำหนดให้ เมื่อ
- คำตอบของข้อนี้จะเป็น
วิธีการด้านบนนี้ จะแก้ปัญหาการคิดค่าความอร่อยของขนมซ้ำซ้อน ด้วยการเพิ่มค่าความอร่อยของขนมหลังจากการคำนวณค่า เป็นที่เรียบร้อยแล้ว และการที่ทำขั้นตอนที่ 3 เฉพาะขนมที่ตำแหน่งของขอบด้านขวาน้อยกว่าตำแหน่งปัจจุบันอยู่ 1 จะทำให้ขนมเหล่านั้นไม่ถูกนำไปคิดซ้ำในตำแหน่งถัดๆ ไป เนื่องจากหากเลือกตำแหน่งที่ เป็นต้นไปแล้ว จะไม่สัมผัสกับขนมชิ้นนั้นอีก
วิธีการดังกล่าวนี้ สามารถลดเวลาการทำงานโดยสังเกตว่าเซตของ ที่มีความจำเป็นสำหรับการคำนวณ จะเป็น เท่านั้น ทำให้เราสามารถใช้การ Coordinate Compression ลดจำนวนของ ที่ต้องคำนวณเหลือเพียง เท่านั้น นอกจากนี้ ขั้นตอนที่ 3 และ 4 สามารถลดเวลาการทำงานด้วยการใช้ Segment Tree และ Lazy Propagation ที่รองรับการหาค่าที่น้อยที่สุดในช่วง และการบวกค่าเป็นช่วง ทำให้สองขั้นตอนนี้ ใช้เวลาการทำงานเพียง
Time Complexity: