1. 程式人生 > >【題解】回文字

【題解】回文字

都是 回文 onclick sed a-z 輸入 () span pen

題目描述

  如果一個單詞從前和從後讀都是一樣的,則稱為回文字。如果一個單詞不是回文字,則可以把它拆分成若幹個回文字。編程求一個給定的字母序列,最多要分割成幾部分,使每一部分都回文字。

輸入格式

  一行,包含一個字符串。字符串由小寫英文字母組成(a-z),長度不超過100。

輸出格式

  一行,為最少的回文字個數。

輸入樣例

anaban

輸出樣例

2

題解

  區間dp。先判斷當前子串是否是回文串,不是的話直接合並即可。

技術分享圖片
#include <iostream> 
#include <algorithm>
#include 
<cstdio> #include <cmath> #include <string> using namespace std; string s; int f[101][101]; bool flag; int main() { cin >> s; for(register int i = s.size() - 1; i >= 0; i--) { for(register int j = i; j < s.size(); j++) { flag
= 1; for(register int k = i; k < i + (j - i + 1) / 2; k++) { if(s[k] != s[j - k + i]) { flag = 0; break; } } if(flag) { f[i][j]
= 1; continue; } f[i][j] = 0xfffff; for(register int k = i; k < j; k++) { f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]); } } } cout << f[0][s.size() - 1]; return 0; }
參考程序

【題解】回文字