time limit:1000ms memory limit:1000k
題型: 程式設計題 語言: 無限制
我們說乙個字串是回文串,那麼意味著這個串從兩邊讀起來的字母都是一樣的。例如racecar是回文串,
然而fastcar則不是。
對乙個串的劃分意思是將乙個串劃分為若干個部分。例如,racecar可以劃分為race 和car兩部分。給出
乙個串,要把這個串劃分為若干個回文串,那麼至少要把這個串劃分為多少部分?
例如'racecar』已經是回文串,劃分為1 個部分即可(這個部分就是racecar)。
『fastcar』 需要被劃分為七個部分 (『f』, 『a』, 『s』, 『t』, 『c』, 『a』, 『r』)。根據回文串的定義,單個字母也是回文串。
『aaadbccb』 分成可以被分為三個回文串 (『aaa』, 『d』, 『bccb』)。找不到更少的劃分方法。
輸入的第一行是數字t,表示輸入檔案含有t個case。之後有t行,每行有乙個長度不大於1000的字
符串,全部由小寫字母組成,中間沒有空格。
輸出格式
對於每個case,輸出乙個數字,表示對該字串的回文串最小劃分。
3racecar
fastcar
aaadbccb17
3提示作者 admin
每次都從字串的第j個位置開始到i,判斷是否是回文串。如果是的話,那麼當前最小劃分數dp[i]等於max(dp[j-1]+1,dp[i]).因為如果該子串是回文串的話,那麼該子串劃分一段就可以了,然後只要看前一段劃分了多少段就可以了,同時前一段劃分數是已知的。
#include
#include
#include
using
namespace std;
char s[
1005];
int dp[
1005];
intok
(int i,
int j)
//i,j下標之間滿足乙個回文串,但不一定是最長的回文串
// cout<<"ok";
return1;
//存在乙個回文串,返回1
}int
main()
}printf
("%d\n"
,dp[
strlen
(s+1)]
);//回文串的最小劃分儲存在 dp[strlen(s)] 中
}return0;
}
8633回文劃分
時間限制 1000ms 記憶體限制 1000k 我們說乙個字串是回文串,那麼意味著這個串從兩邊讀起來的字母都是一樣的。例如racecar是回文串,然而fastcar則不是。對乙個串的劃分意思是將乙個串劃分為若干個部分。例如,racecar可以劃分為race 和car兩部分。給出乙個串,要把這個串劃分...
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 回文串劃分
有乙個字串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...