ข้อนี้ต้องมีพื้นฐานทฤษฎีกราฟและ dynamic programming จึงจะสามารถทำได้
โจทย์ให้ connect graph ที่มี เส้นเชื่อม ดังนั้นกราฟดังกล่าวเป็นต้นไม้ (tree) โจทย์ถามว่า path ที่ label ของจุดสูงขึ้นเรื่อยๆ ที่ยาวประกอบไปด้วยกี่จุด
ลักษณะพิเศษของต้นไม้อย่างหนึ่งคือ ถ้าสองนิพจน์ดังต่อไปนี้เป็นจริง นิพจน์ที่เหลือจะต้องเป็นจริงด้วย
- เป็น connected graph
- มี เส้นเชื่อม
- ระหว่างสองจุดใดๆ จะมี path เดียวเชื่อมระหว่างสองจุดนั้น
ที่เป็นประโยชน์สำหรับข้อนี้ที่สุดคือนิพจน์ 3 เราสามารถ DFS จากแต่ละจุดและหา increasing path ทั้งหมดที่เริ่มจากจุดนั้นได้ โดยจะนำ increasing path ที่ยาวที่สุดที่หาเจอไปตอบ ทั้งหมดนี้ใช้เวลาคำนวณ เนื่องจากต้องเริ่มจากแต่ละจุด (ทั้งหมดมี N จุด) และ DFS แต่ละครั้งใช้เวลา อย่างไรก็ตาม เนื่องจากค่า สูงสุดนั้นมากถึง 300,000 เราจึงไม่สามารถใช้อัลกอริทึมที่มีประสิทธิภาพเพียง ได้
สังเกตุว่าถ้าหากเรากำหนด root ของต้นไม้เป็นจุดใหนก็ได้ (เพื่อความง่ายจะกำหนดเป็นจุด 1) โดยที่ความลึกของแต่ละจุดจะเท่ากับความห่างจากจุด 1 ดังนั้นpath ทั้งหมดจะแบ่งได้เป็นสองประเภท
- path ที่ความลึกสูงขึ้นเรื่อยๆ
- path ที่มี path ประเภทที่ 1 สอง path ประกบกัน
เราจะนิยามตัวแปร DP สองอย่าง
- = path ที่ยาวที่สุดที่เริ่มจาก v โดยที่ความลึกสูงขึ้นเรื่อยๆ (จาก v ลงจุดที่อยู่ด้านล่างเท่านั้น) และ label ของจุดลดลงเรื่อยๆ
- = เหมือนกัน แต่ label ของจุดสูงขึ้นเรื่อยๆ
ถ้าเราต้องการ path แบบที่ 1 (path ที่ความลึกสูงขึ้นเรื่อยๆ) ที่ยาวที่สุด เราสามารถใช้ ที่สูงสุดสำหรับทุก ตอบได้เลย
สำหรับ path แบบที่ 2 (path ที่มี path ประเภทที่ 1 สอง path ประกบกัน) จะใช้ค่า ที่สูงสุดสำหรับทุก เพิ่มด้วย ที่ต้องลบ 1 เพราะว่า ถูกนับซ้ำใน และ
ดังนั้นคำตอบสุดท้ายคือ ที่สูงสุดสำหรับทุก โดยที่ และ สามารถหาได้โดยใช้ DFS