418531 ภาคต้น 2552/โจทย์ปัญหาการโปรแกรมพลวัต I/เฉลยข้อ 3

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา

ให้ คือผลรวมของกำไรที่มากที่สุดที่พิจารณาตำแหน่งการตั้งร้านจากตำแหน่งที่ 1 จนถึงตำแหน่งที่

ดังนั้นกรณีที่ จะได้ว่า

ส่วนกรณีที่ จะได้ว่า เมื่อ คือจำนวนเต็มที่มากที่สุดที่ทำให้ นั่นคือการพิจารณาตำแหน่งที่ เราก็มีทางเลือกอยู่สองทางคือตั้งร้านหรือไม่ตั้งร้าน ถ้าไม่ตั้งร้าน ดังนั้นตำแหน่งที่เราจะตั้งได้ก็ลดลงไปอีกหนึ่ง เหมือนกับไม่คิดถึงการตั้งร้านที่ตำแหน่งที่ นี้นี่เอง ส่วนถ้าเลือกการตั้งร้านที่ตำแหน่งที่ นี้ แน่นอนเราได้กำไรรวมแล้ว หลังจากนั้นเราจะไม่สามารถตั้งร้านได้อีกภายในระยะ จากร้านที่ตำแหน่งที่ นี้ ซึ่งในที่นี้เราใช้ตัวแปร แทนตำแหน่งแรกที่เราสามารถพิจารณาว่าจะตั้งร้านหรือไม่เป็นตำแหน่งต่อไป

เขียนเป็น pseudocode ได้ดังนี้

ให้ เป็น subroutine ในการหา ให้กับแต่ละตำแหน่ง โดยค่าดังกล่าวจะเก็บไว้ในอะเรย์

<geshi lang="c"> FindQi(m,n)

   L = 0
   m[0] = - infinity
   i = 1
   while i <= n
       while m[i]-m[L] > k 
           L<--L + 1
       q[i] = L - 1
       i <-- i + 1

</geshi>

จากนั้นนำอะเรย์ ที่ได้ข้างต้นมาใช้ในการหาค่าการตั้งร้านที่ตำแหน่งต่าง ๆ เพื่อให้ได้กำไรมากที่สุดตาม recurrence ข้างต้นได้ดังนี้

<geshi lang="c"> Yuckdonald(m,n,q,k)

   M[0] = 0
   for i = 1 to n do
       M[i] = max(M[i-1],p[i]+M[q[i]])
   return M[n]

</geshi>