51nod 1154 回文串劃分

2021-08-17 02:04:44 字數 1136 閱讀 2782

1154 回文串劃分

基準時間限制:1 秒 空間限制:131072 kb 分值: 40 

難度:4級演算法題

有乙個字串s,求s最少可以被劃分為多少個回文串。

例如:abbaabaa,有多種劃分方式。

a|bb|aabaa - 3 個回文串

a|bb|a|aba|a - 5 個回文串

a|b|b|a|a|b|a|a - 8 個回文串

其中第1種劃分方式的劃分數量最少。

input

輸入字串s(s的長度<= 5000)。
output

輸出最少的劃分數量。
input示例

abbaabaa
output示例

3
思路:dp,dp[i]表示為 前 i為 所劃分的最小數量,則兩種轉移方程。

一:dp[i]=min    (ji]是回文串)

因此需要預處理出 以 s[j-i]是否為回文串,可以用manacher演算法處理

二:dp[j]=min  (這種是以 s[i]為中心,j,k關於i對稱且a[j]==a[k] 。或者 a[j],a[k]為中心,a[j]==a[k].向兩邊擴充套件)

code1:

#includeusing namespace std;

const int max_n=10005;

string str;

char str[max_n];

int n,len[max_n];

int dp[max_n];

int manacher(char str);

int main()

cout<=r-i)else p=l=r=i;

while(l>=0&&rr-i)?n-i:len[2*p-i];

i++;

} return ans-1;

}

code2:

#includeusing namespace std;

const int max_n=5005;

string str;

int dp[max_n];

int main()

cout<

51nod1154回文串劃分

這道題目剛開始想錯了,本來打算每次找到最大的回文串,結果自己給自己駁倒了,比如dabbbbbdb,最長回文子串是bbbbb,結果四個落單,一共是五個,而如果把最後的bdb放在一組,就一目了然了,4個,所以這種是不行的,到底該如何做呢 dp j 代表了讀到第j個字元的時候出現的回文串最小有多少個 k ...

51Nod 1154回文串劃分

題目鏈結 有乙個字串s,求s最少可以被劃分為多少個回文串。例如abbaabaa,有多種劃分方式。a bb aabaa 3個回文串 a bb a aba a 5個回文串 a b b a a b a a 8個回文串 其中第一種劃分方式的劃分數量最少。輸入 abbaabaa 輸出 3 dp i 表示前i位...

51nod 1154 回文串劃分

1154 回文串劃分 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 收藏關注有乙個字串s,求s最少可以被劃分為多少個回文串。例如 abbaabaa,有多種劃分方式。a bb aabaa 3 個回文串 a bb a aba a 5 個回文串 a b b a a b...