题意:给定一个字符串,分解成多个子串,每个子串都是回文串,问最少能分成多少个子串。
题解:
dp[i]表示前i个字符串分割成最少回文子串的数量;
0<=j<=i;如果字符串从j到i是回文串,那么dp[i]=min(dp[i],dp[j-1]+1);
#include <iostream>
using namespace std;
int dp[1005];
string s;
bool ok(int j,int i)
{
while(j<=i)
{
if(s[j]!=s[i]) return false;
i--;
j++;
}
return true;
}
int main()
{
int n;
cin>>n;
while(n--)
{
cin>>s;
int len=s.length();
for(int i=0;i<len;i++)
dp[i]=i+1;
for(int i=1;i<len;i++)
for(int j=0;j<=i;j++)
{
if(ok(j,i))
{
if(j==0) dp[i]=1;
else dp[i]=min(dp[j-1]+1,dp[i]);
}
}
cout<<dp[len-1]<<endl;
}
return 0;
}