[HDU4628]Pecies

题目

给一个长度小于等于16的字符串,每次可以删去一个回文子序列(可以是单个字母),问删光这个字符串最少需要几步

 

题解

这不就根暴力没啥区别吗。。。

 

代码

 #include<cstdio>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<stack>
#include<sstream>
#include<string>
using namespace std;
#define inf 0x3f3f3f3f

int best,len;
bool vis[1<<20];//判断是否为回文 
int dp[1<<20];//dp状态 
char a[20];

bool check(int i)
{
    if(i==0) return true;
    int l=0;
    int r=len-1;
    while(l<r)
    {
        while(((1<<l)&i)==0) l++;
        while(((1<<r)&i)==0) r--;
        if(a[l]!=a[r]) return false;
        l++;
        r--;
    }
    return true;
}

int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%s",a);
        len=strlen(a);
        best=(1<<len);
        for(int i=0;i<best;i++)
        {
            vis[i]=check(i);
            dp[i]=inf;
        }
        dp[best-1]=0;
        for(int i=best-1;i>=0;--i)
        {
            for(int j=i;j>0;j=((j-1)&i))
            {
                if(!vis[i^j]) continue;//删去的地方不是回文直接过掉
                dp[j]=min(dp[j],dp[i]+1);
            }
            if(vis[i]) dp[0]=min(dp[0],dp[i]+1);//整个状态就是一个回文串,直接删掉 
        }
        printf("%d\n",dp[0]);
    }
    return 0;
}
View Code

 

posted @ 2020-12-12 20:32  EDawn  阅读(135)  评论(0)    收藏  举报