1. 程式人生 > >NKOJ P3009 [CQ Training 2014 Day3] 碎片【狀態壓縮】

NKOJ P3009 [CQ Training 2014 Day3] 碎片【狀態壓縮】

列舉集合與子集:

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