HDU 4628 状态压缩入门

来源:互联网 发布:ubuntu ttf字体安装 编辑:程序博客网 时间:2024/05/16 18:47

hdu 4628  http://acm.hdu.edu.cn/showproblem.php?pid=4628

简单状态压缩 

题意: 给定一串字符串 , 每次可以消掉一串不连续回文串 ,问最少要消除多少次。

思路:先列举出所有是回文串的情况,再进行状态压缩计算。

#include<iostream>#include<string>#include<cstring>using namespace std;const int maxn = (1 << 16) + 5;const int inf = 1 << 30 ;int dp[maxn];bool  is_pa[maxn];int main(){int  T;while(scanf("%d",&T)!=EOF){//getchar();char str[1005];while(T--){memset(is_pa,0,sizeof(is_pa));scanf("%s",str);int n = strlen(str);int i,j;for(i=0;i< (1<<n);i++){int a = 0 ;int b = n-1;while(a<b){while( (i & (1<<a))==0 && a< n-1 ) a++;while( (i & (1<<b))==0 && b> 0 ) b--;if(str[a]!=str[b])break;a++;b--;}if(a<b)continue;is_pa[i]=true;}  // 判断是否回文串。dp[(1<<n)-1]=0;for(i=0;i<=(1<<n)-2;i++)dp[i]=inf;for (i=(1<<n)-2;i>=0;i--)  {  for (j=i;j<(1<<n);j=((j+1)|i) ) {  //j=(j+1)/i;可以使得i每一位为1的时候j的改位也为1if (is_pa[(~i) & j]) dp[i]=min(dp[j]+1,dp[i]);  //(~i&j)可以得出两个串相差的部分。}  }  printf("%d\n",dp[0]);  }}return 0;}

原创粉丝点击