演算法競賽入門經典 例題9 7

2021-10-03 20:35:30 字數 1505 閱讀 4133

uva 11584

partitioning by palindromes

將乙個字串進行劃分,使得劃分後的每一部分都是回文字串,求給定字串的最小劃分。

假設已經找到了前end個字元的最小劃分,現在加入第end + 1個字元,可以將第end + 1個字元作為結尾,向前尋找所有可能的回文串,設回文串的起點為begin,那麼可以將str[begin] ~ str[end + 1]作為乙個新的劃分,和前begin - 1個字元的最優情況進行組合,得到前end個字元的劃分方法,最後在其中取最小值即可。遞推公式為group[end] = min(group[begin - 1] + 1, palindrome[begin][end] == true)

如果每次都重新判斷回文串,那麼在o(n ^ 2)的複雜度上會再引入o(n)的複雜度,使得整體複雜度提公升到o(n ^ 3)。為了降低複雜度,可以提前將所有的回文串都計算出來,然後直接判斷即可。在字串中查詢所有的回文串的時間複雜度也為o(n ^ 3),但是也存在動態規劃的方法。

假設已經找到了前end個字元的所有回文串,現在加入第end + 1個字元,如果第end + 1個字元是乙個回文串的結尾(長度大於1),那麼第end個字元也是乙個回文串的結尾,其對應的開頭為第begin個字元,如果str[begin - 1] == str[end],則str[begin - 1][end]就是乙個回文串。這種方式找到的回文串最小長度為3,所以長度為12的回文串需要單獨計算。

#include

#include

#include

#include

using

namespace std;

void

findpalindrome

(const string &str, vectorbool

>>

&palindrome)}}

}void

findmingroup

(const string &str,

const vectorbool

>>

&palindrome)}}

} cout << group.

back()

<< endl;

}int

main()

return0;

}/*3racecar

fastcar

aaadbccb

*/

演算法競賽入門經典例題

7744問題 問題 輸出所有形如aabb的四位完全平方數 即前兩位數字相等,後兩位數字也相等 include include int main 開燈問題 include include define maxn 1010 int a maxn int main int n,k,first 1 mems...

演算法競賽入門經典 例題4 1

uva1339 ancient cipher 題目意思為判斷明文是否可以經過位置變換以及字母替換得到密文。因為不需要輸出替換方案,只判斷存在性,那就先不考慮搜尋。位置變換不用考慮,因為只要長度一樣,就肯定能逆回去,關鍵是字母替代。可以把明文和密文先進行排序,然後看模式是否相同,比如題目中第一組測試資...

演算法競賽入門經典 例題4 5

uva512 spreadsheet tracking 給定乙個 和一些操作序列,輸出給定單元格在這些操作後的位置。如果在整個 上模擬操作,那麼就需要記錄原始 和最終 中每乙個單元格的對應關係,比如可以通過給單元格內容編號,新加入的單元格編號全0,刪除原始單元格則編號全部改 1,最後在整個 中搜尋原...