题意:
给定一个串,每次可以删除一个回文子串,问把全串删干净的最少次数。
思路:
用状态压缩把所有的状态枚举出来,用数组记录所表示状态所有字符被删除干净的最少次数
如果是回文串则dp为一,不然则为无穷大;
用fun来处理是否为回文串,然后就用dp即、解决了,。。。
#include"stdio.h"
#include"string.h"
int dp[1<<18];
char a[22],s[22];
#define min(a,b) a>b?b:a
int len;
void fun()
{
int i,j,k;
memset(dp,0x3f,sizeof(dp));
for(i=1;i<(1<<len);i++)
{
k=0;
for(j=0;j<len;j++)
{
if(i&1<<j)
a[k++]=s[j];
}
a[k]='\0';
for(j=0;j<k;j++)
{
if(a[j]!=a[k-j-1])
break;
}
if(j==k)
dp[i]=1;
}
}
int main()
{
int i,j,k;
scanf("%d",&k);
while(k--)
{
scanf("%s",s);
len=strlen(s);
fun();
for(i=1;i<(1<<len);i++)
{
for(j=i;j>0;j=(j-1)&i)
{
dp[i]=min(dp[i],dp[i^j]+dp[j]);
}
}
printf("%d\n",dp[(1<<len)-1]);
}
return 0;
}