1154 回文串劃分

2021-08-14 14:58:29 字數 1367 閱讀 9025

有乙個字串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到該點位置最少的劃分量。n*n列舉i、j。

狀態轉移:dp[i+j] = min(dp[i+j],dp[i-j-1]+1);(s[i+j]==s[i-j])

dp[i+j+1] = min(dp[i+j+1],dp[i-j-1]+1);(s[i+j+1]==s[i-j])

**:#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

typedef pairp;

const int inf = 0x3f3f3f3f;

const ll linf = 0x3f3f3f3f3f3f3f3f;

const double pi = acos(-1.0);

const double eps = 1e-10;

const int maxn = 5e3+7;

const int mod = 1e9+7;

char s[maxn];

int dp[maxn];

int main()

dp[0] = 0;

for(int i = 1;i <= n;i++)

j = 0;

while(i-j>=1&&i+j+1<=n&&s[i-j]==s[i+j+1])

}cout<

經驗:看題的時候想到了馬拉車,然後想到拓展kmp,然後是字尾陣列,當然都只是略過,沒深入想,看到n = 5000的時候就有暴力的想法,然後想到最小,然後然後就有了dp的想法。所以說,資料範圍還是很重要的。

回想起的知識點:

字串的處理演算法:

1、kmp

2、雜湊

3、拓展kmp

4、馬拉車(和3的演算法思路很像,和3一樣都是很強的演算法,都是o(n)理論最優演算法)

5、字尾陣列(用處很大,但是用到的比較少)(還有乙個是雜湊字尾陣列。。)

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...

1154 回文串劃分(dp)

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...

51nod1154回文串劃分

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