您的位置:首页 > 其它

uva 11795 状压dp

2015-08-16 21:21 176 查看
UVA 11795 - Mega Man's Mission

Mega 要去解决n个机器人,每解决一个机器人可获得若干把武器。每个机器人只能被特定的武器解决。给出Mega 现有的武器,和解决i号机器人可以获得的武器,求Mega 完成任务的方案数。

状压dp

枚举当前已经解决的机器人状态s,根据s 我们可以得到Mega 现有武器状态k ,通过k 我们可以得出状态 s 再解决一个机器人后能到达的状态 _s。

dp[_s] += dp[s];

#include <bits/stdc++.h>

int N, S;
int r[17];
int dp[(1<<16)+5];
char tmp[20];

int _getRob(char tmp[]) {
	int res = 0;
	for (int i=0; i<N; i++) {
		if (tmp[N-1-i] == '1') {
			res |= (1 << i);
		}
	}
	return res;
}

int _getKill(int s) {
	int res = S;
	for (int i=0; i<N; i++) {
		if ((s & (1<<i)) != 0) 
			res |= r[i];
	}
	return res;
}

int main () {
	int Tcase;
	for (scanf("%d", &Tcase); Tcase>0; --Tcase) {
		scanf ("%d%s", &N, &S);
		for (int i=0; i<N; i++) {
			scanf ("%s", tmp);
			r[i] = _getRob(tmp);
		}

		memset(dp, 0, sizeof(dp));
		dp[0] = 1;

		for (int s=0; s<(1<<N); s++) {
			int k = _getKill(s);

			for (int i=0; i<N; i++) {
				if ((s & (1<<i)) == 0 && (k & (1<<i)) != 0) {
					int _s = s | (1 << i);
					dp[_s] += dp[s];
				}
			}

		printf("%d\n", dp[(1<<N)-1]);
	}
	return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: