题目链接
题目大意
一个字符串,输出最少可以划分为多少个回文子串
解题思路
先预处理一下从i-j是不是回文串
然后d[i] 代表从1到i最小可以划分为几段。
d[i]=min(d[i],d[j-1]+1)//当i-j为回文串时
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int N=1005;
char s[N];
int vis[N][N],d[N];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%s",s+1);
int n=strlen(s+1);
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
vis[i][i]=1;
for(int i=2;i<=n;i++)
{
for(int j=1;j<i;j++)
{
if(s[i]==s[j])
{
if(vis[j+1][i-1]==1)
vis[j][i]=1;
else if(j+1==i)
vis[j][i]=1;
}
}
}
d[0]=0;
d[1]=1;
for(int i=2;i<=n;i++)
{
d[i]=i;
for(int j=1;j<=i;j++)
if(vis[j][i])
{
d[i]=min(d[i],d[j-1]+1);
}
}
printf("%d\n",d[n]);
}
return 0;
}