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

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
(หน้าที่ถูกสร้างด้วย '== นิยามค่า <math>OPT \,</math> == ให้ <math>OPT(i) \,</math> มีค่าเท่ากับผลรวมท…')
 
 
แถว 8: แถว 8:
 
(Induction Case) สมมติว่า <math>OPT(i) \,</math> มีค่าเท่ากับผลรวมที่มากที่สุดของลำดับย่ยอที่ติดกันที่มีช่องสุดท้ายอยู่ที่ช่อง <math>a[i] \,</math> สำหรับ <math>i \geq 1 \,</math> บางค่า พิจารณาลำดับย่อยที่มีผลบวกมากที่สุดจบที่ช่อง <math>a[i+1] \,</math> เราจะได้ว่ามีความเป็นไปได้สองกรณีด้วยกัน
 
(Induction Case) สมมติว่า <math>OPT(i) \,</math> มีค่าเท่ากับผลรวมที่มากที่สุดของลำดับย่ยอที่ติดกันที่มีช่องสุดท้ายอยู่ที่ช่อง <math>a[i] \,</math> สำหรับ <math>i \geq 1 \,</math> บางค่า พิจารณาลำดับย่อยที่มีผลบวกมากที่สุดจบที่ช่อง <math>a[i+1] \,</math> เราจะได้ว่ามีความเป็นไปได้สองกรณีด้วยกัน
 
# ลำดับย่อยนั้นเริ่มต้นที่ช่อง <math>a[i+1] \,</math> ด้วย ในกรณีนี้ <math>OPT(i+1) = a[i+1] \,</math>
 
# ลำดับย่อยนั้นเริ่มต้นที่ช่อง <math>a[i+1] \,</math> ด้วย ในกรณีนี้ <math>OPT(i+1) = a[i+1] \,</math>
# ลำดับย่อยนั้นไม่ได้เริ่มต้อนที่ช่อง <math>a[i+1] \,</math> ในกรณีนี้เราจะได้ว่าลำดับย่อยนั้นเกิดจากการนำเอาลำดับย่อยที่จบที่ช่อง <math>a[i] \,</math> มาต่อกับช่อง <math>a[i+1] \,</math> ฉะนั้นผลรวมที่มากที่สุดของลำดับย่อยนี้คือ <math>OPT(i) + a[i+1] \,</math>
+
# ลำดับย่อยนั้นไม่ได้เริ่มต้นที่ช่อง <math>a[i+1] \,</math> ในกรณีนี้เราจะได้ว่าลำดับย่อยนั้นเกิดจากการนำเอาลำดับย่อยที่จบที่ช่อง <math>a[i] \,</math> มาต่อกับช่อง <math>a[i+1] \,</math> ฉะนั้นผลรวมที่มากที่สุดของลำดับย่อยนี้คือ <math>OPT(i) + a[i+1] \,</math>
 
เมื่อรวมสองกรณีข้างบนเข้าด้วยกัน เราจะได้ว่า <math>OPT(i+1) = \max( a[i+1], OPT(i) + a[i+1] ) \,</math>
 
เมื่อรวมสองกรณีข้างบนเข้าด้วยกัน เราจะได้ว่า <math>OPT(i+1) = \max( a[i+1], OPT(i) + a[i+1] ) \,</math>
  

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

นิยามค่า

ให้ มีค่าเท่ากับผลรวมที่มากที่สุดของลำดับย่อยที่ิคิดกันที่มีช่องสุดท้ายอยู่ที่ช่อง เราจะได้ว่า

เราสามารถพิสูจน์ว่าสมการข้่างบนเป็นจริงได้ด้วย induction ดังต่อไปนี้

(Base Case) ในกรณีนี้ เราจะได้ว่ามีลำดับย่อยที่ติดกันที่จบที่ช่อง อยู่เพียงแค่ลำดับย่อยเดียว คือ ลำดับย่อยทีี่มีช่อง เีพียงช่องเดียว ฉะนั้น ตามต้องการ

(Induction Case) สมมติว่า มีค่าเท่ากับผลรวมที่มากที่สุดของลำดับย่ยอที่ติดกันที่มีช่องสุดท้ายอยู่ที่ช่อง สำหรับ บางค่า พิจารณาลำดับย่อยที่มีผลบวกมากที่สุดจบที่ช่อง เราจะได้ว่ามีความเป็นไปได้สองกรณีด้วยกัน

  1. ลำดับย่อยนั้นเริ่มต้นที่ช่อง ด้วย ในกรณีนี้
  2. ลำดับย่อยนั้นไม่ได้เริ่มต้นที่ช่อง ในกรณีนี้เราจะได้ว่าลำดับย่อยนั้นเกิดจากการนำเอาลำดับย่อยที่จบที่ช่อง มาต่อกับช่อง ฉะนั้นผลรวมที่มากที่สุดของลำดับย่อยนี้คือ

เมื่อรวมสองกรณีข้างบนเข้าด้วยกัน เราจะได้ว่า

ดั้งนั้นเราจึงสรุปได้ว่าสมการข้างบนเป็นจริงสำหรับค่า ทุกค่า

การคำนวณค่า

เราสามารถคำนวณตาราง โดยที่ ได้ดังต่อไปนี้ <geshi lang="C">

   M[1] = a[1]
   for i = 2 to n do
       M[i] = max(a[i], M[i-1] + a[i])

</geshi> เห็นได้อย่างชัดเจนว่าอัลกอรืทึมส่วนนี้ทำงานได้ในเวลา

การหาช่วงที่มีผลบวกมากที่สุด

เราสามารถหาตำแหน่งของช่องสุดท้ายของช่วงที่มีผลบวกมากที่สุดได้ด้วยการหาค่า ที่ทำให้ มากที่สุด

ที่เหลือคือเราจะต้องหาช่องที่ช่วงที่มีผลบวกมากที่สุดเริ่มต้น เราสามารถทำได้โดย pseudocode ต่อไปนี้ <geshi lang="C">

   i = j
   while (M[i] != a[i]) do
       i = i - 1

</geshi> ค่า หลังจากที่ loop ทำงานเสร็จจะมีค่าเท่ากับช่องที่ช่วงที่มีผลบวกมากที่สุดเริ่มต้น

ที่เป็นเช่นนี้เพราะว่า จากสมการข้างบน หากช่วงที่จบที่ นั้นเริ่มต้นจาก ด้วย มิเช่นนั้น ดังนั้นหากเราพบช่วงที่ แสดงว่าช่วงที่จบที่ นั้นเกิดจากการเอาช่วงที่จบที่ มาต่อกับช่อง ดังนั้นเราจึงสามารถหาตำแหน่งเริ่มต้นของช่วงที่จบที่ ด้วยการไปหาตำแหน่งเริ่มต้นของช่วงที่จบที่ แทน

จาก pseudocode ข้างบน เราได้ว่าเราสามารถหาตำแหน่งสิ้นสุด ของช่วงได้ในเวลา และหาตำแหน่งเริ่มต้น ได้ในเวลา เช่นกัน ดังนั้นอัลกอริทึมทั้งหมดจึงทำงานได้ในเวลา