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
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
这道题就是找回文串的最少个数。
dp【i】表示从1位置到i位置的最小回文个数。
方法是两层for循环依次找一遍。就是枚举每一小段(位置j->i)然后看这一段是否是一个回文子串。如果是的话,那么就要考虑状态转移方程,看前j-1个组成的min回文串+(一个j->i回文串)的num跟原来dp【i】比较取小的。状态方程就出来了。
前边我对h insert了第一个字符,目的是这样第一个字母就是从1开始,方便写。
代码:
#include<bits/stdc++.h>
using namespace std;
string h;
int dp[30000];
int judge(int a, int b)
{
while (a <= b && h[a] == h[b])
++a, --b;
return a >= b;
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>h;
h.insert(0,"a");
//cout<<h<<endl;
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
dp[1]=1;
for(int i=1;i<h.length();i++)
{
for(int j=1;j<=i;j++)
{
if(judge(j,i)==1)
{
dp[i]=min(dp[i],dp[j-1]+1);
//cout<<"j: "<<j<<" i:"<<i<<" "<<dp[i]<<"***"<<endl;
}
}
}
cout<<dp[h.length()-1]<<endl;
}
}