题意:给定一个字符串,把该字符串划分为最少的回文串。
思路:dp,到达i点的回文串长度都存起来,那么dp[i]=min(以i为结尾的最短的回文串长度)。
code:
#include <bits/stdc++.h>
using namespace std;
#define ft(i,s,t) for (int i=s;i<=t;i++)
#define cls(v,c) memset(v,c,sizeof(v))
const int N=1005;
const int INF=0x3f3f3f3f;
char s[N];
int len,d[N];
vector<int>v[N];
void sol()
{
cls(d,INF);
ft(i,0,N) v[i].clear();
s[0]='%';len=strlen(s),len--;
ft(i,2,len-1)
{
int j=1;
while (s[i-j]==s[i+j]){
v[i+j].push_back(i-j);
j++;
}
}
ft(i,1,len-1){
int j=0;
while (s[i-j]==s[i+1+j])
{
v[i+1+j].push_back(i-j);
j++;
}
}
}
int main()
{
int T;
scanf("%d",&T);
while (T--)
{
scanf("%s",s+1);
sol();
d[0]=0;
ft(i,1,len)
{
d[i]=d[i-1]+1;
for (int j=0;j<v[i].size();j++)
{
int k=v[i][j];
d[i]=min(d[i],d[k-1]+1);
}
}
printf("%d\n",d[len]==0?1:d[len]);
}
}