We say a sequence of characters is a palindrome if it is the same written forwards and backwards. For example, ‘racecar’ is a palindrome, but ‘fastcar’ is not.
A partition of a sequence of characters is a list of one or more disjoint non-empty groups of consecutive characters whose concatenation yields the initial sequence. For example, (‘race’, ‘car’) is a partition of ‘racecar’ into two groups.
Given a sequence of characters, we can always create a partition of these characters such that each group in the partition is a palindrome! Given this observation it is natural to ask: what is the minimum number of groups needed for a given string such that every group is a palindrome?
For example:
• ‘racecar’ is already a palindrome, therefore it can be partitioned into one group.
• ‘fastcar’ does not contain any non-trivial palindromes, so it must be partitioned as (‘f’, ‘a’, ‘s’, ‘t’, ‘c’, ‘a’, ‘r’).
• ‘aaadbccb’ can be partitioned as (‘aaa’, ‘d’, ‘bccb’).
Input
Input begins with the number n of test cases. Each test case consists of a single line of between 1 and 1000 lowercase letters, with no whitespace within.
Output
For each test case, output a line containing the minimum number of groups required to partition the input into groups of palindromes.
Sample Input
3
racecar
fastcar
aaadbccb
Sample Output
1
7
3
解题思路:题目大意:给定一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000.可以用dp。
程序代码:
#include"stdio.h"
#include"iostream"
#include"string.h"
#include"algorithm"
using namespace std;
const int N=1010;
const int INF = (1<<29);
int n;
int dp[N];
char str[N];
bool judge(int left, int right)
{
for(int i = left, j = right; i <= j; ++i, --j)
if( str[i] != str[j] ) return false;
return true;
}
int main()
{
scanf("%d", &n);
int i, j;
while(n--)
{
scanf("%s", str+1);
int len = strlen(str+1);
for(i = 1; i <= len; ++i)
dp[i] = INF;
dp[0] = 0;
for(i = 1; i <= len; ++i)
{
for(j = 1; j <= i; ++j)
{
if( judge(j, i) )
dp[i] = min(dp[i], dp[j-1]+1);
}
}
printf("%d
", dp[len]);
}
return 0;
}