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

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 2 รุ่นระหว่างกลางโดยผู้ใช้คนเดียวกัน)
แถว 6: แถว 6:
  
 
เขียนเป็น pseudocode ได้ดังนี้
 
เขียนเป็น pseudocode ได้ดังนี้
 +
 +
ให้ <math> FindQi \,</math> เป็น subroutine ในการหา <math> q_i \,</math> ให้กับแต่ละตำแหน่ง <math> i \,</math> โดยค่าดังกล่าวจะเก็บไว้ในอะเรย์ <math> q \,</math>
 +
 +
<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>
 +
 +
จากนั้นนำอะเรย์ <math> q \,</math> ที่ได้ข้างต้นมาใช้ในการหาค่าการตั้งร้านที่ตำแหน่งต่าง ๆ เพื่อให้ได้กำไรมากที่สุดตาม 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>

รุ่นแก้ไขปัจจุบันเมื่อ 10:38, 4 ตุลาคม 2552

ให้ คือผลรวมของกำไรที่มากที่สุดที่พิจารณาตำแหน่งการตั้งร้านจากตำแหน่งที่ 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>