UVA 11795 Mega Man's Mission(状态压缩DP)
2015-03-02 19:33
363 查看
题意:
需要打败N个敌人,初始给出了一个武器,武器能打败一些敌人,打败一个敌人之后就能得到敌人的武器,其武器又可以打败另外的一些敌人,可以携带多把武器。求打败所有敌人的不同顺序数.
思路:
注意到N最大只有16,可以用状态压缩来做,把敌人的死亡情况压缩成二进制。dp[i]表示敌人死亡情况的二进制为i时的方案数
weapon[i]表示敌人死亡情况的二进制位i时,拥有的武器的二进制表示
那么dp[t] += dp[i] 满足t的二进制有一位不同,即敌人死亡情况二进制i时拥有的武器二进制weapon[i]里有一个敌人还没有被杀死过
注意:
dp[0] = 1AC代码
[code]#include <cstdio> #include <cstring> #include <algorithm> #include <cmath> #include <cstdlib> using namespace std; typedef long long ll; const int INF = 0x3f3f3f3f; const int N = 17; int mega; int weapons ; int can_attack[1 << 17]; ll dp[1 << 17]; char buf[20]; void init() { mega = 0; memset(dp, 0, sizeof(dp)); memset(can_attack, 0, sizeof(can_attack)); memset(weapons, 0 , sizeof(weapons)); } int main() { int T, cas = 1, n; scanf("%d", &T); while(T--) { init(); scanf("%d", &n); scanf("%s", buf); for(int i = 0; i < n; i++) { if(buf[i] == '1') { mega |= (1 << i); } } for(int i = 0; i < n; i++) { scanf("%s", buf); for(int j = 0; j < n; j++) { if(buf[j] == '1') { weapons[i] |= (1 << j); } } } int end = 1 << n; for(int st = 0; st < end; st++) { can_attack[st] = mega; for(int i = 0; i < n; i++) { if(st & (1 << i)) { can_attack[st] |= weapons[i]; } } } dp[0] = 1; for(int st = 1; st < end; st++) { for(int i = 0; i < n; i++) { if( (st & (1 << i)) && (can_attack[st^(1<<i)] & (1<<i))) { dp[st] += dp[st^(1<<i)]; } } } printf("Case %d: %lld\n",cas++, dp[end-1]); } return 0; }
相关文章推荐
- UVA 11795 Mega Man's Mission(状态压缩DP)
- UVa11795 Mega Man's Mission(状态压缩DP)
- UVa 11795 - Mega Man's Mission (集合DP 状态压缩)
- uva 11795 Mega Man's Mission(动态规划-状态压缩DP)
- UVa 11795 - Mega Man's Mission 状态压缩dp
- UVa 11795 - Mega Man's Mission(状态压缩dp)
- UVa:11795 Mega Man's Mission(状态压缩)
- UVA - 11795 Mega Man's Mission 状态压缩DP
- 11795 - Mega Man's Mission(DP-状态DP)
- uva_11795_Mega Man's Mission( 簡單狀壓DP )
- UVA - 11795 Mega Man's Mission
- uva11795 Mega Man's Mission
- UVa 11795 Mega Man's Mission(集合动态规划)
- UVA11795-----Mega Man's Mission-----基础的集合式动态规划
- UVA - 11795 Mega Man's Mission
- UVA 11795 Mega Man's Mission 【状压dp】
- uva 10817 - Headmaster's Headache ( 状态压缩dp)
- UVa 10817 - Headmaster's Headache (简单DP 状态压缩)
- uva 10817 - Headmaster's Headache ( 状态压缩dp)
- UVA 10817 Headmaster's Headache(dp 状态压缩 01背包)