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

จาก Theory Wiki
ไปยังการนำทาง ไปยังการค้นหา
แถว 15: แถว 15:
 
<geshi lang="c">
 
<geshi lang="c">
 
PALINDROMIC(s,n)
 
PALINDROMIC(s,n)
     i =1
+
     for i = 1 to n do
    j = n
+
        for j = n downto 1 do
    if i < j then
+
            if i < j then
        M[i,j] = 0
+
                M[i,j] = 0
    else if i = j then
+
            else if i = j then
        M[i,j] = 1
+
                M[i,j] = 1
    else
+
            else
        if s[i] != s[j] then
+
                if s[i] != s[j] then
            M[i,j] = max(M[i+1,j],M[i,j-1])
+
                    M[i,j] = max(M[i+1,j],M[i,j-1])
        else
+
                else
            M[i,j] = max(M[i+1,j],M[i,j-1],2+M[i+1,j-1])
+
                    M[i,j] = max(M[i+1,j],M[i,j-1],2+M[i+1,j-1])
 
     return M[1,n]
 
     return M[1,n]
 
</geshi>
 
</geshi>

รุ่นแก้ไขเมื่อ 09:54, 4 ตุลาคม 2552

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

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

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

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

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

หรือ ถ้า

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

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

   for i = 1 to n do
       for j = n downto 1 do
           if i < j then
               M[i,j] = 0
           else if i = j then
               M[i,j] = 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],2+M[i+1,j-1])
   return M[1,n]

</geshi>