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

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
 
(ไม่แสดง 11 รุ่นระหว่างกลางโดยผู้ใช้ 2 คน)
แถว 22: แถว 22:
  
 
== ข้อ 3 ==
 
== ข้อ 3 ==
[Dasgupta, Papadimitriou, Vazirani 6.3] บัคโดนัลด์ (Yuckdonald's) กำลังวางแผนจะเปิดสาขใหม่บนถนน Quaint Valley Highway (QVH) โดยตำแหน่งในการตั้งสาขาที่เป็นไปได้ทั้งหมดมีอยู่ <math>n \,</math> คำแหน่ง อยู่บนเส้นตรงเส้นหนึ่ง และระยะทางของตำแหน่งเหล่านี้จากจุดเริ่มต้นของ QVH โดยเรียงจากน้อยไปหามาก คือ <math>m_1, m_2, \ldots, m_n \,</math> ตามลำดับ การตั้งสาขาใหม่ของยัคโดนัลด์จะต้องสอดคล้องกับเงื่อนไขต่อไปนี้
+
[Dasgupta, Papadimitriou, Vazirani 6.3] บัคโดนัลด์ (Yuckdonald's) กำลังวางแผนจะเปิดสาขาใหม่บนถนน Quaint Valley Highway (QVH) โดยตำแหน่งในการตั้งสาขาที่เป็นไปได้ทั้งหมดมีอยู่ <math>n \,</math> คำแหน่ง อยู่บนเส้นตรงเส้นหนึ่ง และระยะทางของตำแหน่งเหล่านี้จากจุดเริ่มต้นของ QVH โดยเรียงจากน้อยไปหามาก คือ <math>m_1, m_2, \ldots, m_n \,</math> ตามลำดับ การตั้งสาขาใหม่ของยัคโดนัลด์จะต้องสอดคล้องกับเงื่อนไขต่อไปนี้
 
* ที่ตำแหน่งทีเ่ป็นไปได้ตำแหน่งหนึ่งๆ ยัคโดนัลด์สามารถตั้งสาขาได้อยากมากเพียงสาขาเดียวเท่านั้น โดยหากตั้งสาขาที่ตำแหน่ง <math>m_i \,</math> แล้วยัคโดนัลด์จะได้กำไรโดยเฉลี่ยต่อวันเท่ากับ  <math>p_i \,</math> โดยที่ <math>p_i > 0 \,</math> สำหรับ <math>i = 1, 2, \ldots, n \,</math>
 
* ที่ตำแหน่งทีเ่ป็นไปได้ตำแหน่งหนึ่งๆ ยัคโดนัลด์สามารถตั้งสาขาได้อยากมากเพียงสาขาเดียวเท่านั้น โดยหากตั้งสาขาที่ตำแหน่ง <math>m_i \,</math> แล้วยัคโดนัลด์จะได้กำไรโดยเฉลี่ยต่อวันเท่ากับ  <math>p_i \,</math> โดยที่ <math>p_i > 0 \,</math> สำหรับ <math>i = 1, 2, \ldots, n \,</math>
 
* สาขาสองสาขาควรจะอยู่ห่างกันอย่างน้อย <math>k \,</math> กิโลเมตร โดยที่ <math>k \,</math> เป็นจำนวนเต็มบวก
 
* สาขาสองสาขาควรจะอยู่ห่างกันอย่างน้อย <math>k \,</math> กิโลเมตร โดยที่ <math>k \,</math> เป็นจำนวนเต็มบวก
แถว 68: แถว 68:
  
 
จงออกแบบอัลกอริ่ทึมที่ตรวจสอบว่าสตริงของตัวอักษรทั้งสามตัวข้างบนนี้ ยกตัวอย่างเช่น <math>bbbbac \,</math> สามารถถูกจัดวงเล็บให้เมื่อทำการคูณออกมาแล้วได้ผลลัพธ์เป็น <math>a \,</math> ยกตัวเช่น ถ้าอัลกอริทึมของคุณได้รับข้อมูลเข้าเป็น <math>bbbbac \,</math> อัลกอริทึมของคุณควรจะตอบว่า "ใช่" เนื่องจาก <math>((b(bb))(ba))c = a \,</math>
 
จงออกแบบอัลกอริ่ทึมที่ตรวจสอบว่าสตริงของตัวอักษรทั้งสามตัวข้างบนนี้ ยกตัวอย่างเช่น <math>bbbbac \,</math> สามารถถูกจัดวงเล็บให้เมื่อทำการคูณออกมาแล้วได้ผลลัพธ์เป็น <math>a \,</math> ยกตัวเช่น ถ้าอัลกอริทึมของคุณได้รับข้อมูลเข้าเป็น <math>bbbbac \,</math> อัลกอริทึมของคุณควรจะตอบว่า "ใช่" เนื่องจาก <math>((b(bb))(ba))c = a \,</math>
 +
 +
[[418531 ภาคต้น 2552/โจทย์ปัญหาการโปรแกรมพลวัต I/เฉลยข้อ 5|เฉลย]]
  
 
== ข้อ 6 ==
 
== ข้อ 6 ==
แถว 75: แถว 77:
  
 
จงออกแบบอัลกอริทึมที่ เมื่อให้ลำดับมา หาความยาวของลำดับย่อยที่เป็นพาลินโดรมที่ยาวที่สุด อัลกอริทึมของคุณควรจะทำงานได้ในเวลา <math>O(n^2) \,</math>
 
จงออกแบบอัลกอริทึมที่ เมื่อให้ลำดับมา หาความยาวของลำดับย่อยที่เป็นพาลินโดรมที่ยาวที่สุด อัลกอริทึมของคุณควรจะทำงานได้ในเวลา <math>O(n^2) \,</math>
 +
 +
 +
[[418531 ภาคต้น 2552/โจทย์ปัญหาการโปรแกรมพลวัต I/เฉลยข้อ 6|เฉลย]]
  
 
== ข้อ 7 ==
 
== ข้อ 7 ==
กำหนดสตริง <math>x = x_1x_2 \dotsb x_n \,</math> และ <math>y =y_1 y_2 \dotsb y_m \,</math> เราต้องการหาความยาวของสับสตริงร่วมที่มีความยาวมากที่สุด (longest common substring) กล่าวคือ จำนวนเต็ม <math>k  \,</math> ที่มีค่ามากที่สุดที่ทำให้มีดรรชนี <math>i_1 < i_2 < \dotsb < i_k \,</math> และ <math>j_1 < j_2 < \dotsb < j_k \,</math> ที่ทำให้ <math>x_{i_1} = y_{j_1}, x_{i_2} = y_{j_2}, x_{i_3} = y_{j_3}, \ldots, x_{i_k} = y_{j_k} \,</math> จงออกแบบอัลกอริทึมสำหรับแก้ปัญหานี้ อัลกอริทึมของคุณควรจะทำงานได้ในเวลา <math>O(mn) \,</math>
+
กำหนดสตริง <math>x = x_1x_2 \dotsb x_n \,</math> และ <math>y =y_1 y_2 \dotsb y_m \,</math> เราต้องการหาความยาวของลำดับร่วมที่มีความยาวมากที่สุด (longest common subsequence) กล่าวคือ จำนวนเต็ม <math>k  \,</math> ที่มีค่ามากที่สุดที่ทำให้มีดรรชนี <math>i_1 < i_2 < \dotsb < i_k \,</math> และ <math>j_1 < j_2 < \dotsb < j_k \,</math> ที่ทำให้ <math>x_{i_1} = y_{j_1}, x_{i_2} = y_{j_2}, x_{i_3} = y_{j_3}, \ldots, x_{i_k} = y_{j_k} \,</math> จงออกแบบอัลกอริทึมสำหรับแก้ปัญหานี้ อัลกอริทึมของคุณควรจะทำงานได้ในเวลา <math>O(mn) \,</math>
 +
 
 +
 
 +
[[418531 ภาคต้น 2552/โจทย์ปัญหาการโปรแกรมพลวัต I/เฉลยข้อ 7|เฉลย]]
  
 
== ข้อ 8 ==
 
== ข้อ 8 ==
แถว 83: แถว 91:
 
# ข้อมูลนำเข้า: <math>x_1, x_2, \ldots, x_n, v \,</math>
 
# ข้อมูลนำเข้า: <math>x_1, x_2, \ldots, x_n, v \,</math>
 
# ข้อมูลส่งออก: "ใช่" ถ้าคุณสามารถทอนเงิน <math>v \,</math> บาทได้โดยใชเหรียญ <math>x_1, \ldots, x_n \,</math> โดยใช้เหรียญชนิดละกี่เหรียญก็ได้ มิเช่นนี้ให้ตอบ "ไม่ใช่"
 
# ข้อมูลส่งออก: "ใช่" ถ้าคุณสามารถทอนเงิน <math>v \,</math> บาทได้โดยใชเหรียญ <math>x_1, \ldots, x_n \,</math> โดยใช้เหรียญชนิดละกี่เหรียญก็ได้ มิเช่นนี้ให้ตอบ "ไม่ใช่"
 +
 +
[[418531 ภาคต้น 2552/โจทย์ปัญหาการโปรแกรมพลวัต I/เฉลยข้อ 8|เฉลย]]

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

ข้อ 1

[Dasgupta, Papadimitriou, Vazirani 6.1] ลำดับย่อยที่ติดกันของลำดับ คือสมาชิกกลุ่มหนึ่งของลำดับ ที่อยู่ติดกัน ยกตัวอย่างเช่นถ้า คือลำดับ

5, 15, -30, 10, -5, 40, 10

แล้ว 15, -30, 10 เป็นลำดับย่อยที่ติดกันของ แต่ 5, 15, 40 ไำม่ใช่ จงหาอัลกอริทึมเพื่อแก้ปัญหาทางการคำนวณต่อไปนี้

ข้อมูลเข้า: ลำดับของจำนวน
ข้อมูลออก: ลำดับย่อยที่ติดกันทีมีผลบวกรวมของตัวเลขที่อยู่ในลำดับย่อยนั้นมากที่สุด (ลำดับที่มีความยาว 0 มีผลบวกรวมเท่ากับ 0)

สำหรับตัวอย่างข้างบน คำตอบคือ 10, -5, 40, 10 ซึ่งมีผลบวกรวมเท่ากับ 55

อัลกอริทึมของคุณควรจะทำงานได้ในเวลา

เฉลย

ข้อ 2

[Dasgupta, Papadimitriou, Vazirani 6.2] คุณกำลังจะเดินทางไกลบนถนนยาวเส้ันหนึ่ง คุณเริ่มต้นเดิน ณ หลักกิโลเมตรที่ 0 ริมถนนมีโรงแรมอยู่ โรงแรม ตั้งอยู่ที่ตำแหน่ง โดยที่ค่า แต่ละค่านั้นจะเริ่มวัดจากแหล่งกิโลเมตรที่ 0 คุณสามารถหยุดพักการเดินทางได้โรงแรม โรงแรมนี้เท่านั้น แต่คุณสามารถเลือกได้ว่าจะหยุดพักที่โรงแรมไหน และคุณจะสิ้นสุดการเดินทางที่โรงแรมสุดท้าย ซึ่งตั้งอยู่ที่ตำแหน่ง

Error

Too many requests (f061ab2)

คุณต้องการที่จะเดินทางเป็นระยะทาง 200 กิโลเมตรต่อวัน แต่มันอาจจะเป็นไปไม่ได้ เนื่องจากโรงแรมอาจจะไม่อยู่ห่างกันเท่ากับ 200 กิโลเมตรพอดี ถ้าคุณเดินทางเป็นระยะทางเท่ากับ กิโลเมตรในวันหนึ่ง คุณจะได้รับ penalty เท่ากับ

Error

Too many requests (f061ab2)

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

จงออกแบบอัลกอริทึมที่มีประสิทธิภาพสำหรับแก้ปัญหา

เฉลย

ข้อ 3

[Dasgupta, Papadimitriou, Vazirani 6.3] บัคโดนัลด์ (Yuckdonald's) กำลังวางแผนจะเปิดสาขาใหม่บนถนน Quaint Valley Highway (QVH) โดยตำแหน่งในการตั้งสาขาที่เป็นไปได้ทั้งหมดมีอยู่ คำแหน่ง อยู่บนเส้นตรงเส้นหนึ่ง และระยะทางของตำแหน่งเหล่านี้จากจุดเริ่มต้นของ QVH โดยเรียงจากน้อยไปหามาก คือ ตามลำดับ การตั้งสาขาใหม่ของยัคโดนัลด์จะต้องสอดคล้องกับเงื่อนไขต่อไปนี้

  • ที่ตำแหน่งทีเ่ป็นไปได้ตำแหน่งหนึ่งๆ ยัคโดนัลด์สามารถตั้งสาขาได้อยากมากเพียงสาขาเดียวเท่านั้น โดยหากตั้งสาขาที่ตำแหน่ง แล้วยัคโดนัลด์จะได้กำไรโดยเฉลี่ยต่อวันเท่ากับ โดยที่ สำหรับ
  • สาขาสองสาขาควรจะอยู่ห่างกันอย่างน้อย กิโลเมตร โดยที่ เป็นจำนวนเต็มบวก

จงออกแบบอัลกอริทึมเพื่อคำนวณหาำกำไรเฉลี่ยต่อวันสูงสุดที่ยัคโดนัลด์จะได้จากการตั้งสาขา ณ ตำแหน่งต่างๆ ตามเงื่อนไขข้างบน

เฉลย

ข้อ 4

[Dasgupta, Papadimitriou, Vazirani 6.4] คุณได้รับสตริงความยาว ซึ่งคุณคิดว่าเป็นข้อความที่ถูกตัดเครื่องหมายวรรคตอนทิ้งไปทั้งหมด (ยกตัวอย่างเช่น "iwasthebestoftime") คุณต้องการสร้างข้อความเดิมขึ้นมาโดยใช้ดิกชันนารีเป็นตัวช่วย โดยที่ดิกชันนารีนี้มีรูปแบบเป็นฟังก์ชัน ซึ่งสำหรับสตริง ใดๆ แล้ว ถ้า เป็นคำในดิกชันนารีและ ไมใช่คำในดิกชันนารี

  1. จงใช้ dynamic programming ออกแบบอัลกอริทึตรวจสอบว่าสตริง เกิดจากการนำคำในดิกชันนารีมาเรียงกันหรือไม่ อัลกอริทึมของคุณควรจะทำงานได้ในเวลา หากการเรียก ใช้เวลา
  2. หากสตริงที่ให้มาเกิดจากการเอาคำในดิกชันนารีมาเรียงกันจริงๆ จงออกแบบอัลกอริทึมเพื่อหาลำดับของคำดังกล่าวด้วย


เฉลย

ข้อ 5

[Dasgupta, Papadimitriou, Vazirani 6.6] พิจารณาตารางสูตรคูณของสัญลักษณ์ ดังต่อไปนี้

ภายใต้กฏการคูณข้างบนนี้ เราจะได้ว่า และ เป็นต้น

จงออกแบบอัลกอริ่ทึมที่ตรวจสอบว่าสตริงของตัวอักษรทั้งสามตัวข้างบนนี้ ยกตัวอย่างเช่น

Error

Too many requests (f061ab2)

สามารถถูกจัดวงเล็บให้เมื่อทำการคูณออกมาแล้วได้ผลลัพธ์เป็น ยกตัวเช่น ถ้าอัลกอริทึมของคุณได้รับข้อมูลเข้าเป็น อัลกอริทึมของคุณควรจะตอบว่า "ใช่" เนื่องจาก

เฉลย

ข้อ 6

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

A, C, G, T, G, T, C, A, A, A, A, T, C, G

มีำลำดับย่อยที่เป็นพาลินโดรมอยู่หลายลำดับ เช่น A, C, G, C, A และ A, A, A, A (ในทางกลับกัน A, C, T ไม่ใช่พาลินโีดรม)

จงออกแบบอัลกอริทึมที่ เมื่อให้ลำดับมา หาความยาวของลำดับย่อยที่เป็นพาลินโดรมที่ยาวที่สุด อัลกอริทึมของคุณควรจะทำงานได้ในเวลา


เฉลย

ข้อ 7

กำหนดสตริง

Error

Too many requests (f061ab2)

และ เราต้องการหาความยาวของลำดับร่วมที่มีความยาวมากที่สุด (longest common subsequence) กล่าวคือ จำนวนเต็ม ที่มีค่ามากที่สุดที่ทำให้มีดรรชนี และ ที่ทำให้ จงออกแบบอัลกอริทึมสำหรับแก้ปัญหานี้ อัลกอริทึมของคุณควรจะทำงานได้ในเวลา


เฉลย

ข้อ 8

สมมติว่าคุณเหรียญที่มีค่า

Error

Too many requests (f061ab2)

บาท อยู่ชนิืดละเป็นจำนวนมากมายนับไม่ถ้วน คุณต้องการทอนเงินจำนวน บาท กล่าวคือ คุณต้องการหาเซตของเหรียญกลุ่มหนึี่งที่มีผลรวมเท่ากับ พอดี การทอนเงินนี้อาจเป็นไปไม่ได้ ยกตัวอย่างเช่น ถ้าคุณมีแค่เหรียญ 5 บาทกับ 10 บาท คุณสามารถทอนเงิน 15 บาทได้ แต่ไม่สามารถทอนเงิน 12 บาทได้ เป็นต้น จงออกแบบอัลกอริทึมที่ใช้เวลาการทำงาน ที่ใช้แก้ปัญหาทางการคำนวณต่อไปนี้

  1. ข้อมูลนำเข้า:
  2. ข้อมูลส่งออก: "ใช่" ถ้าคุณสามารถทอนเงิน บาทได้โดยใชเหรียญ โดยใช้เหรียญชนิดละกี่เหรียญก็ได้ มิเช่นนี้ให้ตอบ "ไม่ใช่"

เฉลย

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