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
,所以長度為1
和2
的回文串需要單獨計算。
#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,最後在整個 中搜尋原...