记得做过类似于这类题目是能够用组合数学方法来解决的,可惜淡忘了,也找不到了,看了网上的也有人提到过能够用组合公式解决,但是没人做,都是用了状压DP的方法,这个状压非常难讲清楚吧,推荐两篇

第一遍大体看看这个:http://blog.csdn.net/crux_d/article/details/2206736

想要详细实现的时候看看他的解析:http://blog.csdn.net/yan_____/article/details/8719748

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<list>
  4. #include<algorithm>
  5. #include<cstring>
  6. #include<string>
  7. #include<queue>
  8. #include<stack>
  9. #include<map>
  10. #include<vector>
  11. #include<cmath>
  12. #include<memory.h>
  13. #include<set>
  14. #include<cctype>
  15.  
  16. #define ll long long
  17.  
  18. #define LL __int64
  19.  
  20. #define eps 1e-8
  21.  
  22. #define inf 0xfffffff
  23.  
  24. //const LL INF = 1LL<<61;
  25.  
  26. using namespace std;
  27.  
  28. //vector<pair<int,int> > G;
  29. //typedef pair<int,int > P;
  30. //vector<pair<int,int> > ::iterator iter;
  31. //
  32. //map<ll,int >mp;
  33. //map<ll,int >::iterator p;
  34.  
  35. ll dp[12][10000];//第i行状态为j的放置方法数
  36.  
  37. int binary[15000][2];//[i][0]表示当前这一行的状态,[i][1]表示与[i][0]相匹配的下一行的状态,由于竖着放会影响下一行
  38.  
  39. int w,h,cnt;
  40.  
  41. void init() {
  42. cnt = 0;
  43. memset(dp,0,sizeof(dp));
  44. }
  45.  
  46. void dfs(int n,int now,int nex) {
  47. if(n > w)return;//还有个n+2的,所以有可能直接大于w,而不会产生等于w
  48. if(n == w) {
  49. binary[cnt][0] = now;
  50. binary[cnt++][1] = nex;
  51. return;
  52. }
  53. dfs(n+2,(now<<2) + 3,(nex<<2) + 3);
  54. dfs(n+1,(now<<1) + 1,nex<<1);
  55. dfs(n+1,now<<1,(nex<<1) + 1);
  56. }
  57.  
  58. int main() {
  59. while(scanf("%d %d",&w,&h),w + h) {
  60. init();
  61. dfs(0,0,0);
  62. dp[0][(1<<w) - 1] = 1;//边界要填满1
  63. for(int i=0;i<h;i++)
  64. for(int j=0;j<cnt;j++)
  65. dp[i+1][binary[j][1]] += dp[i][binary[j][0]];//下一行的与当前一行的相匹配,所以可递推
  66. printf("%lld\n",dp[h][(1<<w) - 1]);
  67. }
  68. return 0;
  69. }

ZOJ1100 状压DP +深搜的更多相关文章

  1. [noip2016]愤怒的小鸟<状压dp+暴搜>

    题目链接:https://vijos.org/p/2008 现在回过头去看去年的考试题,发现都不是太难,至少每道题都有头绪了... 这道题的数据范围是18,这么小,直接暴力呗,跑个暴搜就完了,时间也就 ...

  2. hdu5305(2015多校2)--Friends(状压,深搜)

    Friends Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Su ...

  3. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  4. 状压dp的另一种形式

    做的那么多都是一些比较怎么说呢,都是在数网格一类的题目之中,这些题目有些有点固定的套路,而一些需要状态压缩的题目呢,则么是真正对状态转移的考验. 这道题呢,被彻底打脸了,以后一定要任性一点一道题做不出 ...

  5. Codeforces 429C Guess the Tree(状压DP+贪心)

    吐槽:这道题真心坑...做了一整天,我太蒻了... 题意 构造一棵 $ n $ 个节点的树,要求满足以下条件: 每个非叶子节点至少包含2个儿子: 以节点 $ i $ 为根的子树中必须包含 $ c_i ...

  6. CODEVS1358【DFS/状压DP】

    题目链接[http://codevs.cn/problem/1358/] 题意:这个游戏在一个有10*10个格子的棋盘上进行,初始时棋子位于左上角,终点为右下角,棋盘上每个格子内有一个0到9的数字,每 ...

  7. 【NOIP2017】宝藏 题解(状压DP)

    题目描述 参与考古挖掘的小明得到了一份藏宝图,藏宝图上标出了 nnn 个深埋在地下的宝藏屋, 也给出了这 nnn 个宝藏屋之间可供开发的m mm 条道路和它们的长度. 小明决心亲自前往挖掘所有宝藏屋中 ...

  8. 【状压DP】bzoj1087 互不侵犯king

    一.题目 Description 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上.下.左.右,以及左上.左下.右上.右下八个方向上附近的各一个格子,共8个格子. I ...

  9. BZOJ-1087 互不侵犯King 状压DP+DFS预处理

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MB Submit: 2337 Solved: 1366 [Submit][ ...

随机推荐

  1. C++临时对象销毁时间

    下面这段代码会输出什么? const char* p = string("hello temprary string").c_str(); cout << p; 下面这 ...

  2. AndroidUI 引导页面的使用

    一个应用程序都少不了欢迎页面和引导页面,本文主要讲如何制作一个引页面: 首页所有的目录结构: 新建Welcome引导页面和Activity: <RelativeLayout xmlns:andr ...

  3. Python实现CGI环境

    要想安装Python的CGI环境,就继续往下看吧. 首先,要确定apache服务可以使用CGI服务. 打开apache的配置文件,设置如图. 在启动的apache服务的系统目录下,创建目录如/User ...

  4. android 的线程模型和AsyncTask

            android 的线程模型:当一个 android 的应用运行后,就会有一个 UI 的 main 线程启动 , 这是一个非常重要的线程,它负责把事件分派到相应的控件,其中就包括屏幕绘图 ...

  5. 赵雅智_BroadcastReceiver电话监听

    AndroidManifest.xml 注冊广播接收者 加入权限 <?xml version="1.0" encoding="utf-8"?> &l ...

  6. ORA-01950: 对表空间 'NAMETABLESPACE' 无权限

    只要将Role下的Resource权限赋予给当前用户即可解决上述问题.

  7. bat文件自动编译InnoSetup脚本

    今天想制作一个bat文件,打包多个innosetup脚本,参考链接:http://www.cnblogs.com/joean/p/4870428.html 流程: 新建文本文档,将.txt改为.bat ...

  8. 更改Oracle数据文件名及数据文件存放路径

    更改Oracle数据文件名及数据文件存放路径 SQL> select * from v$dbfile;        FILE# NAME ---------- ---------------- ...

  9. MFC网络编程

    一.概念1.同步方式与异步方式同步方式:发送方不等接收方响应,便接着发送下一个数据包的通信方式异步方式:发送方发出数据,等收到接收方发回的响应后,才发送下一个数据包的通信方式2.阻塞与非阻塞方式阻塞套 ...

  10. mysql utf8_bin跟utf8_general_ci的区别

    ci是 case insensitive, 即 "大小写不敏感", a 和 A 会在字符判断中会被当做一样的; bin 是二进制, a 和 A 会别区别对待. 例如你运行: SEL ...