冬马党

Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
Submit Status

终于到了冬马党与雪菜党决战的时候了,为了方便,他们的决战之地可看成一个n×m矩阵。

决战前夜,冬马党安插在雪菜党中的内线告诉白学家Kuros,雪菜党已经在他们的决战之地埋下了地雷。

白学家Kuros根据多年来扫雷的经验,推测出雪菜党一定不会在相邻的格子里都放地雷。(两个格子相邻指它们共享一条边)并且,根据先遣部队的探查,某些格子的土地非常坚硬,是不可能埋地雷的。

为了冬马党最终的胜利,Kuros想知道,雪菜党总共有多少种方案来放地雷。

Input

输入第一行为两个整数n,m,表示决战之地的大小。(1≤n≤12,1≤m≤12)

接下来n行,每行m个数,0表示该土地不能放地雷,1表示该土地可以埋地雷。

Output

一行,一个整数,表示总的方案数,答案取100000000的余数。

Sample input and output

Sample Input Sample Output
2 3
1 1 1
0 1 0
9

Source

2014 UESTC Training for Dynamic Programming
 
解题报告
f(i,j) 表示第i行摆放情况为j的方案数.
用一个dfs进行转移.注意情况:
1.上一行的这个位置已经放了地雷,那么这一行的这里肯定不能再放
2.题目明确禁止这行的这个位置不允许放地雷.
因为我的dfs没有检查同一行两枚地雷相同的情况(非法),所以转移的时候j必须合法,最后答案计数的时候j也必须合法.
最重要的是。。。不要爆了long long(我挂了两发。。)
代码用了滚动数组进行优化~
 
 #include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
typedef long long ll;
using namespace std;
const ll mod = ;
ll f[][ << ];
bool g[][];
int n,m,r,cur=; void dfs(int pos,int val,ll add)
{
if (pos == -)
f[cur][val] = (f[cur][val] + add) % mod;
else
{
if (val >> pos & || !g[r][pos]) //上一行的这个位置已经放了地雷 / 这个地方不允许放地雷
dfs(pos-,val & ~( << pos),add);
else
{
dfs(pos-,val | ( << pos),add);
dfs(pos-,val,add);
}
}
} bool check(int x)
{
int pre = ;
for(int i = ; i < m ; ++ i)
{
int newx = x >> i & ;
if (newx && pre)
return false;
pre = newx;
}
return true;
} int main(int argc,char *argv[])
{
memset(g,true,sizeof(g));
memset(f,,sizeof(f));
scanf("%d%d",&n,&m);
for(int i = ; i < n ; ++ i)
for(int j = ; j < m ; ++ j)
{
int temp;
scanf("%d",&temp);
if (!temp)
g[i][j] = false;
}
r = ;
dfs(m-, , );
for(int i = ; i < n ; ++ i)
{
cur ^= ;
r = i;
for(int j = ; j < ( << m) ; ++ j) f[cur][j] = ;
for(int j = ; j < ( << m) ; ++ j)
if (check(j))
dfs(m-,j,f[cur^][j]);
}
int ans = ;
for(int i = ; i < ( << m) ; ++ i)
if (check(i))
ans = (ans + f[cur][i]) % mod;
printf("%lld\n",ans % mod);
return ;
}

UESTC_冬马党 CDOJ 882的更多相关文章

  1. UESTC 882 冬马党 --状压DP

    定义:dp[i][j]为状态为j时,第i行符合条件的状态数 转移方程:dp[i][j] += dp[i-1][t]   //t为上一行状态,与当前行不冲突. 从第一行开始向下枚举,每次枚举当前行的状态 ...

  2. UESTC_神秘绑架案 CDOJ 881

    神秘绑架案 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Sta ...

  3. UESTC_方老师买表 CDOJ 885

    老师买表 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Stat ...

  4. 2014 UESTC暑前集训动态规划专题解题报告

    A.爱管闲事 http://www.cnblogs.com/whatbeg/p/3762733.html B.轻音乐同好会 C.温泉旅馆 http://www.cnblogs.com/whatbeg/ ...

  5. Codeforces 433A (背包)

    题面 传送门 真是令人胃疼的题面 我不管,我要把苹果都给雪菜!(滑稽)(冬马党不要打我) 分析 突然感觉这题跟今年NOIP Day1T2有点像,都是根据数加减来构造背包,只不过这题是01背包而不是完全 ...

  6. 学习进度04(billbill长评数据提取01)

    学习了python写入csv文件自己想了一个小实战,爬取billbill<白色相簿>番剧的长评 网页是动态变化的,往下拉他才会更新出长评,找出关键链接https://api.bilibil ...

  7. UESTC_温泉旅店 CDOJ 878

    天空飘下一朵一朵的雪花,这是一片纯白的世界. 在天空之下的温泉旅店里,雪菜已醉倒在一旁,冬马与春希看了看说着梦话的雪菜,决定找一点玩的来度过这愉快的晚上. 这家旅店提供一种特色游戏,游戏有n张牌,各写 ...

  8. UESTC_摩天轮 2015 UESTC Training for Dynamic Programming<Problem K>

    K - 摩天轮 Time Limit: 10000/4000MS (Java/Others)     Memory Limit: 262143/262143KB (Java/Others) Submi ...

  9. 【BZOJ-2892&1171】强袭作战&大sz的游戏 权值线段树+单调队列+标记永久化+DP

    2892: 强袭作战 Time Limit: 50 Sec  Memory Limit: 512 MBSubmit: 45  Solved: 30[Submit][Status][Discuss] D ...

随机推荐

  1. HTTP常见的状态码

    状态码的职责是当客户端向服务器端发送请求时,描述返回请求结果.借助状态码,用户可以知道服务器端是正常处理了请求,还是出现了什么错误.RFC2616定义的状态码,由3位数字和原因短信组成.数字中的第一位 ...

  2. 通过expdp/impdp进行oracle数据库的备份恢复详细指导

    假定导出oracle数据库home目录为/opt/oracle,数据库用户为exp_user/test,导入用户为imp_user/test,给出如下样例,具体使用时根据实际情况修改路径及用户名/密码 ...

  3. 方案:在Eclipse IDE 中搭建Python开发环境

    Eclipse是一款功能强大的IDE,Python是一种功能强大的计算机语言,但是Python的IDE环境确实很缺乏,如果在强大的Eclipse中添加Python开发环境,那样就很完美了. 在这里,我 ...

  4. OpenStack Mixture HypervisorsDriver configure and implementation theory

    通过本文,您将可以了解在 OpenStack 中如何进行混合 Hypervisor 的配置及其实现原理的基本分析.本文主要结合作者在 Nova 中的实际开发经验对 OpenStack 中混合 Hype ...

  5. dig命令(转载)

    dig命令使用大全(linux上域名查询) 可以这样说,翻译本篇文档的过程就是我重新学习DNS的过程,dig命令可以帮助我们学习DNS的原理,配置,以及其查询过程.以前使用dig仅仅是查询一下A记录或 ...

  6. Android学习笔记__1__Android体系架构

    Android 体系结构图 Android作为一个移动设备的平台,其软件层次结构包括了一个操作系统(OS),中间件(MiddleWare)和应用程序(Application).根据Android的软件 ...

  7. C++中malloc/free和new/delete 的使用

    malloc/free 的使用要点 函数malloc的原型如下: void * malloc(size_t size); 用malloc申请一块长度为length的整数类型的内存,程序如下: int ...

  8. IOS上 关于状态栏的相关设置(UIStatusBar)

    知识普及 ios上状态栏 就是指的最上面的20像素高的部分 状态栏分前后两部分,要分清这两个概念,后面会用到: 前景部分:就是指的显示电池.时间等部分: 背景部分:就是显示黑色或者图片的背景部分: 如 ...

  9. 连数据库是ODBC好还是OLEDB好

    1.连数据库是ODBC好还是OLEDB好?2.是不是只有微软的数据库才可以用OLEDB?3.要切换这两种连接,是不是只需要修改连接字符串?谢谢大家了,小弟对这三个问题不解 分享到:   2009-03 ...

  10. Android项目svn代码管理问题

    用svn控制版本,svn本身是不会识别哪些该传,哪些不该传,这就导致有些关于路径的东西(比如拓展jar的路径)也被上传了,而当别人下载后,那个路径对于这个人可能完全不存在,项目编译就会出问题.用ecl ...