hdu 4628Pieces

来源:互联网 发布:复杂网络上的博弈 编辑:程序博客网 时间:2024/06/06 02:52

采用集合的方式进行判断,判断所有的子字符串情况,看是否符合回文

#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int len;int f[(1<<16)+2];char s[18];void solve (int n){    char str[18];    for(int i=1; i<len; ++i)    {        int p=0;        for(int j=0; j<n; ++j)            if(i&(1<<j)) str[p++]=s[j];        bool flag=0;        for(int j=0; j<p/2; ++j)            if(str[j]!=str[p-j-1])            {                flag=1;                break;            }        if(flag) f[i]=p;        else f[i]=1;    }}int main(){  //  freopen("in.txt","r",stdin);    int t;    scanf("%d",&t);    while(t--)    {        scanf("%s",s);        int n=strlen(s);        len=1<<n;        solve(n);        for(int i=1; i<len; ++i)            for(int s0=i; s0; s0=(s0-1)&i)                f[i]=min(f[i],f[s0]+f[i^s0]);        printf("%d\n",f[(1<<n)-1]);    }    return 0;}#include <cstdio>#include <cstring>#include <algorithm>using namespace std;int len;int f[(1<<16)+2];char s[18];int solve (int cur,int n){    char str[18];    int p=0;    for(int i=0;i<n;++i)        if(cur&(1<<i)) str[p++]=s[i];    for(int i=0;i<p/2;++i)        if(str[i]!=str[p-i-1]) return p;    return 1;}int main(){    //freopen("in.txt","r",stdin);    int t;    scanf("%d",&t);    while(t--)    {        scanf("%s",s);        int n=strlen(s);        len=1<<n;        for(int i=1;i<len;++i) f[i]=solve(i,n);        for(int i=1; i<len; ++i)            for(int s0=i; s0; s0=(s0-1)&i)                f[i]=min(f[i],f[s0]+f[i^s0]);        printf("%d\n",f[(1<<n)-1]);    }    return 0;}


原创粉丝点击