NKOJ P3009 [CQ Training 2014 Day3] 碎片【狀態壓縮】
阿新 • • 發佈:2018-12-12
列舉集合與子集:
#include <cmath> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #define rep(i,x,y) for(int i=(x);i<=(y);i++) #define repl(i,x,y) for(int i=(x);i<(y);i++) #define repd(i,x,y) for(int i=(x);i>=(y);i--) using namespace std; const int N=17; const int Inf=1e9; char ch[N]; int n,m,cnt,f[1<<N],w[N*N]; bool check(int x) { w[0]=0; rep(i,1,16) if(x&(1<<(i-1))) w[++w[0]]=ch[i]-'='; rep(i,1,w[0]) if(w[i]!=w[w[0]+1-i]) return false; return true; } int main() { scanf("%s",ch+1); n=strlen(ch+1);m=(1<<n)-1; rep(i,1,m) { if(check(i)) f[i]=1; else f[i]=Inf; for(int s=i;s;s=(s-1)&i) f[i]=min(f[i],f[s]+f[i^s]); } printf("%d",f[m]); return 0; }