delightful world--计蒜客(DFS)
2016-04-25 19:24
399 查看
http://nanti.jisuanke.com/t/11067
题目大意: 给你一个n和m 下面是m个字符串和k 每一字符串的长度是n 你要找一个串跟每一个串匹配 有k个字符是和这个串相等 让你求有多少个正确的串
他说 k最大是5 所以就直接枚举第一个串的正确的位置 然后跟其他的比较 枚举最大的也就是C(35,5) 32万多
题目大意: 给你一个n和m 下面是m个字符串和k 每一字符串的长度是n 你要找一个串跟每一个串匹配 有k个字符是和这个串相等 让你求有多少个正确的串
他说 k最大是5 所以就直接枚举第一个串的正确的位置 然后跟其他的比较 枚举最大的也就是C(35,5) 32万多
#include<stdio.h> #include<string.h> #include<stdlib.h> #include<ctype.h> #include<math.h> #include<queue> #include<algorithm> #include<iostream> using namespace std; #define N 50 const double ESP = 1e-8; #define INF 0xffffffff #define memset(a,b) memset(a,b,sizeof(a)) int n,m; char maps ; int c ,a ; char ch ; int ans=0; int judge() { for(int i=1; i<=m; i++) { int t=0; for(int j=1; j<=n; j++) { if(maps[i][j]==ch[j]) t++; } if(t!=a[i]) return false; } return true; } int ok() { for(int i=1; i<=n; i++) { if(c[i]==1) ch[i]=maps[1][i]; else if(maps[1][i]=='1') ch[i]='0'; else ch[i]='1'; } if(judge()) return true; return false; } void DFS(int nn,int k) { if(nn<k) return; if(k==0) { if(ok()) ans++; return; } c[nn]=0; DFS(nn-1,k); c[nn]=1; DFS(nn-1,k-1); c[nn]=0; } int main() { memset(a,0); memset(c,0); memset(maps,0); memset(ch,0); while(scanf("%d %d",&n,&m)!=EOF) { memset(a,0); memset(c,0); memset(maps,0); memset(ch,0); for(int i=1; i<=m; i++) { scanf("%s %d",maps[i]+1,&a[i]); } ans=0; DFS(n,a[1]); printf("%d\n",ans); } return 0; }
相关文章推荐
- ToughRADIUS 与 RouterOS对接指南
- 光线与包围盒(AABB)的相交检测算法
- sysstat工具的用法
- KMP算法(C语言版)
- LightOJ 1019-Brush (V)【最短路,模板题】
- 总结
- 工作总结08
- HDU 4310 Hero (贪心算法)
- js中的 AOP
- Linux 系统应用编程——线程基础
- iOS UIImageView 动图
- java---缓冲输入输出流BufferedInputStream和BufferedOutputStream
- Linux 系统应用编程——线程基础
- Linux 系统应用编程——线程基础
- 代码仓库
- WebBrowser与IE的关系,如何设置WebBrowser工作在IE9模式下?
- 从1-100中隔5个数去掉一个数,最后去掉的哪个数(如果数过一遍了从前端接着开始)?
- MySQL查询--使用LEFT JOIN解决同一张表查询
- 使用ToughMySQL为ToughRADIUS系统提供数据存储
- exe4j的使用