题目很容易,找到状态DP[i] 表示前 i 个字符中最少的划分,那么转移
DP[i] = min {DP[j] + 1 | s[j +1]...s[i] 为 palindromes}
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 6 #define REP(i,N) for (int i = 0;i < (N);i++) 7 #define REP_1(i,N) for (int i = 1;i < (N);i++) 8 #define REP_2(i,be,en) for (int i = (be);i < (en);i++) 9 #define DWN(i,N) for (int i = N;i >= 0;i--) 10 #define INF 0x3f3f3f3f 11 #define MAXN 1010 12 using namespace std; 13 14 char str[MAXN]; 15 int dp[MAXN]; 16 17 bool is_palindromes(int i,int j) { 18 if (i >= j) return 1; 19 if (str[i] == str[j]) return is_palindromes(i + 1,j - 1); 20 else return 0; 21 } 22 23 int main () { 24 int T; 25 freopen("1.txt","r",stdin); 26 cin >> T; 27 while (T--) { 28 scanf("%s",str + 1); 29 int len = strlen(str + 1); 30 REP(i,len + 1) { 31 dp[i] = i; 32 REP(j,i) { 33 if (is_palindromes(j + 1,i)) { 34 dp[i] = min(dp[j] + 1,dp[i]); 35 } 36 } 37 } 38 cout << dp[len] << endl; 39 } 40 }