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];
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; }
相关文章推荐
- leetcode中第一题twosum问题解答算法的可行性证明
- mongodb异常关闭后,再启动需要删除mongod.lock文件
- Java Swing创建自定义闪屏:在闪屏上添加Swing进度条控件(转)
- Connection reset by peer问题分析
- Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流)
- Valgrind简单用法
- 软件架构设计
- 双向链表,定义一个节点,具有next、previous和data属性
- hdu 5131 Song Jiang's rank list(模拟)
- typedef和#define究竟有什么区别?
- HDU 3338 - Kakuro Extension(网络流‘最大流)
- 带参数的main函数的使用
- Linux下的调试工具
- seci-log 1.05 发布,日志分析增加业务系统日志
- Leetcode -- Insertion Sort List
- hdu 1061Rightmost Digit 模幂运算
- uva 1456 dp 求期望
- 104 Maximum Depth of Binary Tree
- 09 文件和输入输出 - 《Python 核心编程》
- HBase伪分布安装