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

นิยามค่า

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

Error

Too many requests (f061ab2)

เราจะได้ว่า

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

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

Error

Too many requests (f061ab2)

ตามต้องการ

(Induction Case) สมมติว่า

Error

Too many requests (f061ab2)

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

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

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

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

Error

Too many requests (f061ab2)

ทุกค่า

การคำนวณค่า

เราสามารถคำนวณตาราง

Error

Too many requests (f061ab2)

โดยที่ ได้ดังต่อไปนี้ <geshi lang="C">

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

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

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

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

Error

Too many requests (f061ab2)

มากที่สุด

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

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

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

ที่เป็นเช่นนี้เพราะว่า จากสมการข้างบน

Error

Too many requests (f061ab2)

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

จาก pseudocode ข้างบน เราได้ว่าเราสามารถหาตำแหน่งสิ้นสุด

Error

Too many requests (f061ab2)

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

รายการเลือกการนำทาง