ZOJ1100 状压DP +深搜
记得做过类似于这类题目是能够用组合数学方法来解决的,可惜淡忘了,也找不到了,看了网上的也有人提到过能够用组合公式解决,但是没人做,都是用了状压DP的方法,这个状压非常难讲清楚吧,推荐两篇
第一遍大体看看这个:http://blog.csdn.net/crux_d/article/details/2206736
想要详细实现的时候看看他的解析:http://blog.csdn.net/yan_____/article/details/8719748
- #include<iostream>
- #include<cstdio>
- #include<list>
- #include<algorithm>
- #include<cstring>
- #include<string>
- #include<queue>
- #include<stack>
- #include<map>
- #include<vector>
- #include<cmath>
- #include<memory.h>
- #include<set>
- #include<cctype>
- #define ll long long
- #define LL __int64
- #define eps 1e-8
- #define inf 0xfffffff
- //const LL INF = 1LL<<61;
- using namespace std;
- //vector<pair<int,int> > G;
- //typedef pair<int,int > P;
- //vector<pair<int,int> > ::iterator iter;
- //
- //map<ll,int >mp;
- //map<ll,int >::iterator p;
- ll dp[12][10000];//第i行状态为j的放置方法数
- int binary[15000][2];//[i][0]表示当前这一行的状态,[i][1]表示与[i][0]相匹配的下一行的状态,由于竖着放会影响下一行
- int w,h,cnt;
- void init() {
- cnt = 0;
- memset(dp,0,sizeof(dp));
- }
- void dfs(int n,int now,int nex) {
- if(n > w)return;//还有个n+2的,所以有可能直接大于w,而不会产生等于w
- if(n == w) {
- binary[cnt][0] = now;
- binary[cnt++][1] = nex;
- return;
- }
- dfs(n+2,(now<<2) + 3,(nex<<2) + 3);
- dfs(n+1,(now<<1) + 1,nex<<1);
- dfs(n+1,now<<1,(nex<<1) + 1);
- }
- int main() {
- while(scanf("%d %d",&w,&h),w + h) {
- init();
- dfs(0,0,0);
- dp[0][(1<<w) - 1] = 1;//边界要填满1
- for(int i=0;i<h;i++)
- for(int j=0;j<cnt;j++)
- dp[i+1][binary[j][1]] += dp[i][binary[j][0]];//下一行的与当前一行的相匹配,所以可递推
- printf("%lld\n",dp[h][(1<<w) - 1]);
- }
- return 0;
- }
ZOJ1100 状压DP +深搜的更多相关文章
- [noip2016]愤怒的小鸟<状压dp+暴搜>
题目链接:https://vijos.org/p/2008 现在回过头去看去年的考试题,发现都不是太难,至少每道题都有头绪了... 这道题的数据范围是18,这么小,直接暴力呗,跑个暴搜就完了,时间也就 ...
- hdu5305(2015多校2)--Friends(状压,深搜)
Friends Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) Total Su ...
- 树形DP和状压DP和背包DP
树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...
- 状压dp的另一种形式
做的那么多都是一些比较怎么说呢,都是在数网格一类的题目之中,这些题目有些有点固定的套路,而一些需要状态压缩的题目呢,则么是真正对状态转移的考验. 这道题呢,被彻底打脸了,以后一定要任性一点一道题做不出 ...
- Codeforces 429C Guess the Tree(状压DP+贪心)
吐槽:这道题真心坑...做了一整天,我太蒻了... 题意 构造一棵 $ n $ 个节点的树,要求满足以下条件: 每个非叶子节点至少包含2个儿子: 以节点 $ i $ 为根的子树中必须包含 $ c_i ...
- CODEVS1358【DFS/状压DP】
题目链接[http://codevs.cn/problem/1358/] 题意:这个游戏在一个有10*10个格子的棋盘上进行,初始时棋子位于左上角,终点为右下角,棋盘上每个格子内有一个0到9的数字,每 ...
- 【NOIP2017】宝藏 题解(状压DP)
题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...
- 【状压DP】bzoj1087 互不侵犯king
一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...
- BZOJ-1087 互不侵犯King 状压DP+DFS预处理
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...
随机推荐
- C++临时对象销毁时间
下面这段代码会输出什么? const char* p = string("hello temprary string").c_str(); cout << p; 下面这 ...
- AndroidUI 引导页面的使用
一个应用程序都少不了欢迎页面和引导页面,本文主要讲如何制作一个引页面: 首页所有的目录结构: 新建Welcome引导页面和Activity: <RelativeLayout xmlns:andr ...
- Python实现CGI环境
要想安装Python的CGI环境,就继续往下看吧. 首先,要确定apache服务可以使用CGI服务. 打开apache的配置文件,设置如图. 在启动的apache服务的系统目录下,创建目录如/User ...
- android 的线程模型和AsyncTask
android 的线程模型:当一个 android 的应用运行后,就会有一个 UI 的 main 线程启动 , 这是一个非常重要的线程,它负责把事件分派到相应的控件,其中就包括屏幕绘图 ...
- 赵雅智_BroadcastReceiver电话监听
AndroidManifest.xml 注冊广播接收者 加入权限 <?xml version="1.0" encoding="utf-8"?> &l ...
- ORA-01950: 对表空间 'NAMETABLESPACE' 无权限
只要将Role下的Resource权限赋予给当前用户即可解决上述问题.
- bat文件自动编译InnoSetup脚本
今天想制作一个bat文件,打包多个innosetup脚本,参考链接:http://www.cnblogs.com/joean/p/4870428.html 流程: 新建文本文档,将.txt改为.bat ...
- 更改Oracle数据文件名及数据文件存放路径
更改Oracle数据文件名及数据文件存放路径 SQL> select * from v$dbfile; FILE# NAME ---------- ---------------- ...
- MFC网络编程
一.概念1.同步方式与异步方式同步方式:发送方不等接收方响应,便接着发送下一个数据包的通信方式异步方式:发送方发出数据,等收到接收方发回的响应后,才发送下一个数据包的通信方式2.阻塞与非阻塞方式阻塞套 ...
- mysql utf8_bin跟utf8_general_ci的区别
ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的; bin 是二进制, a 和 A 会别区别对待. 例如你运行: SEL ...