题意:给一个字符串,求最少能分成几个回文串。
dp[i] 代表前i+1个字符最少分成几个串。
每个新的结尾字符有两种选择: 1.加入一个串使这个新串变成回文串
2.自己成为一个新串
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[100000];
char s[100000];
int T;
bool judge(int from , int to)
{
while(from <= to)
{
if(s[from] != s[to])
{
return false;
}
from++;
to--;
}
return true;
}
int main ()
{
cin >> T;
while(T--)
{
cin >> s;
int len = strlen(s);
memset(dp,0,sizeof(dp));
for(int i = 0 ; i < len ; i++)
{
dp[i] = i+1;
for(int j = 0 ; j <= i ; j++)
{
if(judge(j,i))
dp[i] = min (dp[j-1]+1,dp[i]);
}
}
cout << dp[len-1] << endl;
}
return 0;
}