题意:给定一个字符串,把该字符串划分为最少的回文串。
思路: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]);}
}