การดำเนินการซือกีตีกา (Segi Tiga Operation)

toi11_segitiga

โดยทั่วไป เราสามารถแก้โจทย์ที่ถามเกี่ยวกับการใส่วงเล็บให้ได้ค่าน้อยสุด/มากสุด/ตรงตามเงื่อนไขได้ด้วย Dynamic Programming แบบ Substring State นั่นคือ แต่ละช่องของตาราง DP จะแสดงถึงวิธีการแก้ปัญหาหากพิจารณาว่ามีข้อมูลนำเข้าเพียงแค่ช่วงที่ติดกันช่วงหนึ่งเท่านั้น

พิจารณาแต่ละชุดทดสอบ เพื่อความสะดวก

  • จะเรียก bitstring ที่ให้มาว่า ss ซึ่งมีความยาวทั้งหมด nn ตัวอักษร (n=sn = |s|)
  • หากเขียนว่า sis_i จะหมายถึงตัวอักษร ณ ตำแหน่งที่ ii
  • หากเขียนว่า si..js_{i..j} จะหมายถึง substring ทั้งหมดตั้งแต่ตำแหน่งที่ ii ถึง jj

นิยาม: dpl,r,cdp_{l,r,c} มีค่าเป็นจริงก็ต่อเมื่อมีวิธีใส่วงเล็บให้สตริง sl..rs_{l..r} ได้ผลลัพธ์ออกมาเป็น cc (1lrn1 \leq l \leq r \leq n, 0c20\leq c \leq 2)

กรณี l=rl=r จะได้ dpl,r,cdp_{l,r,c} เป็นจริงก็ต่อเมื่อ sl=cs_l = c

กรณี l<rl < r หากเราต้องการทราบว่าสามารถใส่วงเล็บให้ได้ผลลัพธ์ c=0c=0 หรือไม่ เราสามารถทดลองใส่วงเล็บแบ่งสตริงช่วง [l,r][l,r] ออกเป็นสองช่วง [l,x][l,x] และ [x+1,r][x+1, r] ณ แต่ละตำแหน่ง xx ที่ lx<rl \leq x < r แล้วตรวจสอบว่ามีวิธีทำให้ช่วงด้านซ้ายเป็นเลข 00 และช่วงด้านขวาเป็นเลข 22 ได้หรือไม่ ถ้ามีการแบ่งอย่างน้อยหนึ่งตำแหน่งที่ทำได้ แปลว่าเราสามารถทำให้สตริง (sl..x)(s(x+1)..r)(s_{l..x}) \nabla (s_{(x+1)..r}) ดำเนินการได้ 02=00 \nabla 2 = 0 ตามที่เราต้องการ

สรุปเป็น recurrence formula ได้ว่า

dpl,r,0=lx<r(dpl,x,0dpx+1,r,2)dp_{l,r,0} = \bigvee\limits_{l \leq x < r}\left( dp_{l,x,0} \wedge dp_{x+1,r,2} \right)

สำหรับกรณี c=1c=1 สามารถคิดได้คล้าย ๆ กัน แต่ว่ามีตัวเลือกในการสร้างผลลัพธ์ทางด้านซ้ายและทางด้านขวาหลายแบบ ได้แก่ 010 \nabla 1, 111 \nabla 1, 121 \nabla 2, 202 \nabla 0, และ 222 \nabla 2 ซึ่งหากทำได้อย่างน้อยหนึ่งแบบก็ถือว่า dpl,r,cdp_{l,r,c} เป็นจริง

{dpl,x,0dpx+1,r,1dpl,x,1dpx+1,r,1dpl,x,1dpx+1,r,2dpl,x,2dpx+1,r,0dpl,x,2dpx+1,r,2\begin{cases} dp_{l,x,0} \wedge dp_{x+1,r,1} \\ dp_{l,x,1} \wedge dp_{x+1,r,1} \\ dp_{l,x,1} \wedge dp_{x+1,r,2} \\ dp_{l,x,2} \wedge dp_{x+1,r,0} \\ dp_{l,x,2} \wedge dp_{x+1,r,2} \\ \end{cases}

ส่วนกรณี c=2c=2 คือ

{dpl,x,0dpx+1,r,0dpl,x,1dpx+1,r,0dpl,x,2dpx+1,r,1\begin{cases} dp_{l,x,0} \wedge dp_{x+1,r,0} \\ dp_{l,x,1} \wedge dp_{x+1,r,0} \\ dp_{l,x,2} \wedge dp_{x+1,r,1} \end{cases}

หากสร้างตาราง dpl,r,cdp_{l,r,c} ด้วยสูตรดังกล่าว (สำหรับแบบ bottom-up จำเป็นต้องไล่ตั้งแต่ช่วงที่มีขนาดเล็กสุดไปยังช่วงที่มีขนาด nn ตัวอักษร) จะได้คำตอบเป็น "yes" เมื่อ dp1,n,0dp_{1,n,0} เป็นจริง มิเช่นนั้นตอบ "no"