记录编号 39307 评测结果 EEEEEEEEEE
题目名称 项链制作 最终得分 0
用户昵称 GravatarCC 是否通过 未通过
代码语言 C++ 运行时间 1.026 s
提交时间 2012-07-08 17:47:32 内存使用 4.11 MiB
显示代码纯文本
#include <cstdio> 
#include <algorithm> 
#include <cstring> 
int n,mm; 
int c[20][20],dd[20],f[500000],g[500000];
int prepare(int u) {
	int tmp = 1;
	for (int i = 1;i <= n;i++) 
		if (dd[i] & u) 
			for (int j = i + 1;j <= n;j++) 
				if (dd[j] & u) 
					tmp *= (c[i][j] + 1);
	return tmp;
}
int dp(int u) {
	if (g[u]) return g[u];
	int minu,tmp = 0;
	for (minu = 1;;minu++) if (dd[minu] & u) break;
	u ^= dd[minu];
	if (u == 0) return g[dd[minu]] = 1;
	for (int i = (u - 1) & u;;(--i) &= u) {
		tmp += dp(i + dd[minu]) * f[u ^ i];
		if (i == 0) break;
	}
	return g[u |= dd[minu]] = f[u] - tmp;
}

int main() {
	freopen("necklace.in","r",stdin);
	freopen("necklace.out","w",stdout);
	scanf("%d", &n);
	mm = (1 << n) - 1;
	for (int i = 1;i <= n;i++)
		for (int j = 1;j <= n;j++) scanf("%d", &c[i][j]);
	dd[1] = 1;
	for (int i = 2;i <= n;i++) dd[i] = dd[i - 1] << 1;
	for (int i = 1;i <= mm;i++) f[i] = prepare(i);
	printf("%d\n",dp(mm));
	return 0;
}