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

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 2: แถว 2:
  
 
ให้ <math> OPT(i,j) \,</math> คือความยาวของลำดับย่อยที่เป็นพาลินโดรมที่ยาวที่สุดของสตริง <math> s[i,i+1,...,j] \,</math>
 
ให้ <math> OPT(i,j) \,</math> คือความยาวของลำดับย่อยที่เป็นพาลินโดรมที่ยาวที่สุดของสตริง <math> s[i,i+1,...,j] \,</math>
 +
 +
พิจารณากรณีที่ <math> i > j \,</math> จะได้ว่า <math> OPT(i,j) = 0 \,</math>
 +
 +
กรณีที่ <math> i=j \,</math> จะได้ว่า <math> OPT(1,1)=1 \,</math>
 +
 +
ส่วนกรณีที่เหลือจะได้ว่า <math> OPT(i,j)= max(OPT(i+1,j),OPT(i,j-1))\,</math> ถ้า <math> s[i] != s[j] \,</math>
 +
 +
หรือ <math> OPT(i,j) = max(OPT(i+1,j),OPT(i,j-1),OPT(i+1,j-1))\,</math> ถ้า <math> s[i] = s[j] \,</math>
 +
 +
เขียนเป็น pseudocode ได้ดังนี้
 +
 +
<geshi lang="c">
 +
PALINDROMIC(s,n)
 +
    i =1
 +
    j = n
 +
    if i < j then
 +
        return 0
 +
    else if i = j then
 +
        return 1
 +
    else
 +
        if s[i] != s[j] then
 +
            M[i,j] = max(M[i+1,j],M[i,j-1])
 +
        else
 +
            M[i,j] = max(M[i+1,j],M[i,j-1],M[i+1,j-1])
 +
    return M[1,n]
 +
</geshi>

รุ่นแก้ไขเมื่อ 08:30, 3 ตุลาคม 2552

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

ให้ คือความยาวของลำดับย่อยที่เป็นพาลินโดรมที่ยาวที่สุดของสตริง

พิจารณากรณีที่ จะได้ว่า

กรณีที่ จะได้ว่า

ส่วนกรณีที่เหลือจะได้ว่า ถ้า

หรือ ถ้า

เขียนเป็น pseudocode ได้ดังนี้

<geshi lang="c"> PALINDROMIC(s,n)

   i =1
   j = n
   if i < j then
       return 0
   else if i = j then
       return 1
   else
       if s[i] != s[j] then
           M[i,j] = max(M[i+1,j],M[i,j-1])
       else
           M[i,j] = max(M[i+1,j],M[i,j-1],M[i+1,j-1])
   return M[1,n]

</geshi>