比赛的时候怎么就不会做,要是有多菜!
直接把所有的回文串状态存下来,然后就变成很直白的状态压缩DP了。
#include<stdio.h>
#include<string.h>
#define N 17
int st[1<<N],dp[1<<N];
int n;
char s[N];
int Min(int x,int y)
{
if(x<y)
return x;
return y;
}
int judge(int x)
{
char s1[N],i,j;
i=0;
int cnt=n;
while(x>0)
{
if(x&1)
s1[i++]=s[cnt];
cnt--;
x>>=1;
}
s1[i]='\0';
int ln=strlen(s1);
j=ln-1;
for(i=0;i<ln;i++)
{
if(s1[i]!=s1[j--])
return 0;
}
return 1;
}
int Init()
{
int i,j,t;
t=1<<n;
j=0;
for(i=0;i<t;i++)
{
if(judge(i))
st[j++]=i;
}
return j;
}
int main()
{
int T;
scanf("%d",&T);
getchar();
while(T--)
{
gets(s+1);
n=strlen(s+1);
memset(dp,0x3f,sizeof(dp));
dp[(1<<n)-1]=0;
int t,tt;
t=Init();
tt=1<<n;
int i,j,k;
for(j=tt-1;j>=0;j--)
{
for(k=0;k<t;k++)
{
if((st[k]&j)==st[k]&&dp[j]!=-1)
dp[j-st[k]]=Min(dp[j]+1,dp[j-st[k]]);
}
}
printf("%d\n",dp[0]);
}
return 0;
}