题目大意:给出一个由小写字母组成的字符串,要求你将其划分成尽量少的段,使得每段都是回文字符串
解题思路:设dp[i]为扫描到i时最少的回文字符串是几段,则得转移方程dp[i] = min(dp[i],dp[j-1] + 1),这个条件是第j个到第i个的字符组成的字符串是一个回文字符串
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define maxn 1010
char str[maxn];
int dp[maxn];
bool judge(int start, int end) {
for(; end > start; start++, end--)
if(str[start] != str[end])
return false;
return true;
}
int main() {
int n;
scanf("%d", &n);
while(n--) {
scanf("%s", str + 1);
int len = strlen(str+1);
memset(dp,0x3f,sizeof(dp));
dp[0] = 0;
for(int i = 1; i <= len; i++)
for(int j = 1; j <= i; j++)
if(judge(j,i))
dp[i] = min(dp[i],dp[j-1]+1);
printf("%d\n",dp[len]);
}
return 0;
}