HDU 4628 状态压缩入门
2013-11-25 20:52
225 查看
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的改位也为1 if (is_pa[(~i) & j]) dp[i]=min(dp[j]+1,dp[i]); //(~i&j)可以得出两个串相差的部分。 } } printf("%d\n",dp[0]); } } return 0; }
相关文章推荐
- hdu 4628(状态压缩)
- hdu 4628 Pieces 状态压缩DP
- hdu 4628 Pieces(状态压缩DP)
- hdu 4628 Pieces(状态压缩+记忆化搜索)
- hdu 4628(状态压缩dp)
- HDU 4628 状态压缩
- hdu 4628 Pieces 状态压缩DP
- Hdu-1565 方格取数(1) (状态压缩dp入门题
- hdu 4628 状态压缩dp
- HDU 4628 Pieces(DP + 状态压缩)
- hdu 4628 Pieces(状态压缩+DP,4级)
- hdu - 4628 - Pieces(状态压缩dp)
- HDU4628+状态压缩DP
- HDU 4628 Pieces(状态压缩dp)
- HDU4628+状态压缩DP
- HDU 4628 Pieces(状态压缩+记忆化搜索)
- hdu 4628 Pieces(状态压缩+记忆化搜索)
- HDU 2167 Pebbles 状态压缩DP入门题(3)
- hdu 4628 Pieces (状态压缩dp)
- hdu 2167 状态压缩dp(入门题目)