[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; }

浙公网安备 33010602011771号