UVa11795
来源:互联网 发布:淘宝网开直通车的要求 编辑:程序博客网 时间:2024/05/22 11:56
题目链接
简介:
每个怪物需要特定的武器击败,每消灭一个怪物将会得到ta的武器
计算可以消灭所有怪物的序列总数
分析:
状压dp
monster[i]:打倒的怪物的状态为i时,获得的武器可以打倒的怪物
arms[i]:拥有的武器为i时,可以打倒的怪物
f[i]:打倒的怪物的状态为i时,可能的方案数
arms数组就是输入数据转化为二进制数
在转移的的时候,枚举下一个打倒的怪物
tip
开ll
#include<cstdio>#include<cstring>#include<iostream>#define ll long longusing namespace std;const int N=70000;int er[18]={0,1,2,4,8,16,32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536}; //这里并不是2^i,而是2^(i-1),这样就可以和1~n的怪物对应起来了,第i个怪物对应的就是er[i]int n;int arms[N],monster[N];ll f[N];void doit(){ int i,j,k; f[0]=1; for (i=0;i<(1<<n)-1;i++) { if (!f[i]) continue; k=monster[i]; //下一步可以打倒的怪物 for (j=1;j<=n;j++) if ((k&er[j])!=0&&(i&er[j])==0) //枚举下一个打倒的怪物 f[i|er[j]]+=f[i]; }}int main(){ int T; scanf("%d",&T); for (int cas=1;cas<=T;cas++) { memset(arms,0,sizeof(arms)); memset(monster,0,sizeof(monster)); memset(f,0,sizeof(f)); scanf("%d",&n); char s[20]; scanf("%s",&s); int k=0; for (int i=0;i<n;i++) if (s[i]=='1') k+=er[i+1]; arms[0]=k; monster[0]=k; //拥有第0件武器 for (int i=1;i<=n;i++) { scanf("%s",&s); int k=0; for (int j=0;j<n;j++) if (s[j]=='1') k+=er[j+1]; arms[er[i]]=k; } for (int i=1;i<(1<<n);i++) //打倒怪物k之后就可以获得武器k { int k=monster[0]; for (int j=1;j<=n;j++) if (i&er[j]) k|=arms[er[j]]; monster[i]=k; } doit(); printf("Case %d: %lld\n",cas,f[(1<<n)-1]); } return 0;}
阅读全文
0 0
- uva11795
- uva11795
- UVa11795
- 状态压缩 uva11795
- Mega Man‘s Missions UVA11795
- uva11795 Mega Man's Mission
- uva11795 简单状态压缩DP
- UVa11795 Mega Man's Mission(状态压缩DP)
- Mega Man's Mission UVA11795(状态压缩dp)
- UVA11795-Mega Man's Mission(状压dp)
- UVA11795-----Mega Man's Mission-----基础的集合式动态规划
- UVA11795——Mega Mans Missions(集合DP,状态压缩)
- ECharts开发入门
- java基本教程之join方法详解 java多线程
- 中山大学算法课程题目详解(第六周)
- 机器学习及实践 2.1.1.1 线性分类器
- Hyperlynx学习笔记
- UVa11795
- Python urllib.urlretrieves 代码实例
- 你还不知道jsonp跨域,引发的安全问题的严重性?这里帮你修复。
- Going deeper with convolutions----------(GoogLeNet) 论文解读
- Rhyme/ Linux fdisk 手工分区
- Golang设计模式之代理模式
- 2017.10自考总结
- SSO单点登录三种情况的实现方式详解
- Action如何去使用session request ,application等。。。