Mega Man's Mission UVA11795(状态压缩dp)
来源:互联网 发布:cc免费顶级域名注册 编辑:程序博客网 时间:2024/05/01 00:42
大意:
主角自己有一些武器,然后每个机器人身上有一些武器,每个机器人需要用特定的武器才能消灭。
问,有多少种消灭机器人的顺序。
思路:
用 dp[S][i] 表示现在消灭的机器人集合为S(获得的武器也隐含在其中了,不用再开一维),而且是通过消灭第i号机器人到这个状态,这个状态下的顺序总数。
我的代码用了一个atk[S][j] 数组,表示在消灭了S这个集合机器人的情况下,能不能消灭第j个机器人,这样方便一些。
#include<iostream>#include<string.h>#include<string>#include<algorithm>#include<stdio.h>#include<vector>#define LL long long intusing namespace std;LL dp[1<<17][17];int atk[1<<17][17];//?????????????????????????i????char grid[17][17];int n;void process(){ memset(atk,0,sizeof(atk)); for(int i=0;i<n;i++) { atk[0][i]=grid[0][i]-'0'; } for(int i=1;i<(1<<n);i++) { for(int j=0;j<n;j++) { if( ((i)&(1<<j))==0 ) continue; int subset=i-(1<<j); for(int k=0;k<n;k++) { atk[i][k]|=atk[subset][k]; } for(int k=0;k<n;k++) { atk[i][k]|=grid[j+1][k]-'0'; } } }}void solve(){ //????????? memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++) { dp[1<<i][i]=grid[0][i]-'0'; } for(int i=1;i<(1<<n);i++) { for(int j=0;j<n;j++) { if( ((i)&(1<<j))==0 ) continue; int subset=i-(1<<j); if(subset==0) continue; if(atk[subset][j]==1) { for(int k=0;k<n;k++) { dp[i][j]+=dp[subset][k]; } } } }}int main(){ int t; cin>>t; for(int CS=1;CS<=t;CS++) { cin>>n; for(int i=0;i<=n;i++) { scanf("%s",grid[i]); } process(); solve(); LL ans=0; for(int i=0;i<n;i++) ans+=dp[(1<<n)-1][i]; printf("Case %d: %lld\n",CS,ans);//23423423423 } return 0;}
0 0
- Mega Man's Mission UVA11795(状态压缩dp)
- UVa11795 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)
- uva11795 Mega Man's Mission
- 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 状态压缩DP
- UVA 11795 Mega Man's Mission(状态压缩DP)
- UVa:11795 Mega Man's Mission(状态压缩)
- UVa 11795 - Mega Man's Mission(集合DP 状态压缩)
- uva 11795 Mega Man's Mission(动态规划-状态压缩DP)
- UVa 11795 Mega Man's Mission(动态规划-状态压缩DP)
- 11795 - Mega Man's Mission(DP-状态DP)
- UVA 11795 Mega Man's Mission | 状态压缩
- buffer 与 Cache 的区别
- Java常用面试题
- LinkedList
- 关于eclipse项目红色感叹号的解决办法
- javascript简介
- Mega Man's Mission UVA11795(状态压缩dp)
- ROS Learning-006 beginner_Tutorials 编译ROS程序包
- CSS中!important的使用
- 【linux系统学习笔记】Ubuntu文本界面和图像界面的切换
- It seems that the port 3306 is already in use.aer you sure you want to use this port
- 设计模式之Builder模式
- 【模拟】Codeforces 691B s-palindrome
- 面试之JAVA
- MP4文件格式的解析,以及MP4文件的分割算法