ผลต่างระหว่างรุ่นของ "418531 ภาคต้น 2552/โจทย์ปัญหาการโปรแกรมพลวัต I/เฉลยข้อ 3"
Aoy (คุย | มีส่วนร่วม) |
Aoy (คุย | มีส่วนร่วม) |
||
(ไม่แสดง 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>