题目大意:给出一个由小写字母组成的字符串,要求你将其划分成尽量少的段,使得每段都是回文字符串

解题思路:设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;
}