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

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

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

พิจารณากรณีที่

Error

Too many requests (f061ab2)

จะได้ว่า

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

Error

Too many requests (f061ab2)

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

Error

Too many requests (f061ab2)

ถ้า

หรือ ถ้า

Error

Too many requests (f061ab2)

เขียนเป็น 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>

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