ผลต่างระหว่างรุ่นของ "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>