题目大意:删除一个字符串里面的回文子串,问最少需要多少次可以删完整个字符串
题解:其实是个蛮简单的题目,比赛完了艾神一点就会了,比赛的时候就是没想到,比赛的时候没想到状态怎么压缩。。还是经验不够。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn (1<<16)
using namespace std;
int dp[maxn];
int statu[maxn],nstatu;
int n,T,len;
char s[20];
int maxStatu;
bool check(char *t,int vlen)
{
int vv=vlen/2;
for(int i=0;i<vv;i++)if(t[i]!=t[vlen-i-1])return false;
return true;
}
void init()
{
scanf("%s",s);
memset(dp,0xf,sizeof(dp));
len=strlen(s);
maxStatu=1<<len;
int vlen;
char ts[20];
nstatu=0;
for(int i=1;i<maxStatu;i++)
{
vlen=0;
for(int j=0;j<len;j++)
{
if((1<<j)&i)
{
ts[vlen++]=s[j];
}
}
ts[vlen]='\0';
if(check(ts,vlen))statu[nstatu++]=i;
}
}
void solve()
{
dp[0]=0;
for(int j=0;j<nstatu;j++)
{
int st=statu[j];
for(int i=0;i<maxStatu;i++)
{
if((i&st)==0)
{
dp[i|st]=min(dp[i|st],dp[i]+1);
}
}
}
printf("%d\n",dp[(1<<len)-1]);
}
int main()
{
scanf("%d",&T);
while(T--)
{
init();
solve();
}
return 0;
}