题目

给定一个$n \times m$的$01$矩形,选择其中为$1$的位置,要求互不相邻,问方案数。

解决方案

直接dp因为状态较多,数组很难直接表示出来,我们采用二进制状态压缩存储。

用$dp[i][j]$表示第$i$行$j$状态的方案数,不难写出状态方程$dp[i][j] += dp[i-1][k]$,同时要求$j, k$内部没有相邻的1,$j, k$之间也没有相邻的1,最终答案只需累加第$i$行所有状态下的值.

  1. #include<cstdio>
  2. using namespace std;
  3.  
  4. const int mod = ;
  5. int n, m;
  6. int maze[];
  7. int dp[][ <<];
  8.  
  9. bool judge(int i, int j)
  10. {
  11. if((maze[i] & j) != j) return false; //j只是maze[i]的一部分
  12. if(j & (j << )) return false; //存在相邻的1
  13. return true;
  14. }
  15.  
  16. void solve()
  17. {
  18. dp[][] = ;
  19. for(int i = ;i <= n;i++) //枚举每一行
  20. {
  21. for(int j = ;j < ( << m);j++) //枚举第i行所有的状态
  22. {
  23. if(!judge(i, j )) continue;
  24. for(int k = ;k < ( <<m);k++) //枚举第i-1行所有的状态
  25. {
  26. if(j & k) continue;
  27. dp[i][j] = (dp[i][j] + dp[i-][k]) % mod;
  28. }
  29. }
  30. }
  31. int ans = ;
  32. for(int i= ;i < ( << m);i++) ans = (ans + dp[n][i]) % mod;
  33. printf("%d\n", ans);
  34. }
  35.  
  36. int main()
  37. {
  38. scanf("%d%d", &n, &m);
  39. int tmp;
  40. for(int i = ;i <= n;i++)
  41. {
  42. for(int j = ;j < m;j++)
  43. {
  44. scanf("%d", &tmp);
  45. maze[i] = (maze[i] << ) + tmp; //注意位运算的优先级
  46. }
  47. }
  48.  
  49. solve();
  50.  
  51. return ;
  52. }

参考链接:https://blog.csdn.net/mengxiang000000/article/details/51075506

  

P3254——DP&&入门的更多相关文章

  1. poj 3254 状压dp入门题

    1.poj 3254  Corn Fields    状态压缩dp入门题 2.总结:二进制实在巧妙,以前从来没想过可以这样用. 题意:n行m列,1表示肥沃,0表示贫瘠,把牛放在肥沃处,要求所有牛不能相 ...

  2. xbz分组题B 吉利数字 数位dp入门

    B吉利数字时限:1s [题目描述]算卦大湿biboyouyun最近得出一个神奇的结论,如果一个数字,它的各个数位相加能够被10整除,则称它为吉利数.现在叫你计算某个区间内有多少个吉利数字. [输入]第 ...

  3. 【dp入门题】【跟着14练dp吧...囧】

    A HDU_2048 数塔 dp入门题——数塔问题:求路径的最大和: 状态方程: dp[i][j] = max(dp[i+1][j], dp[i+1][j+1])+a[i][j];dp[n][j] = ...

  4. 数位dp入门 hdu2089 不要62

    数位dp入门 hdu2089 不要62 题意: 给定一个区间[n,m] (0< n ≤ m<1000000),找出不含4和'62'的数的个数 (ps:开始以为直接暴力可以..貌似可以,但是 ...

  5. POJ 2342 树形DP入门题

    有一个大学的庆典晚会,想邀请一些在大学任职的人来參加,每一个人有自己的搞笑值,可是如今遇到一个问题就是假设两个人之间有直接的上下级关系,那么他们中仅仅能有一个来參加,求请来一部分人之后,搞笑值的最大是 ...

  6. hdu3555 Bomb 数位DP入门

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 简单的数位DP入门题目 思路和hdu2089基本一样 直接贴代码了,代码里有详细的注释 代码: ...

  7. 【专章】dp入门

    动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门. ***实践是检验真理的唯一标准,看再多文章不如自己动手做几道!!!*** 先 ...

  8. HDU 2084 数塔(简单DP入门)

    数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  9. 树形dp 入门

    今天学了树形dp,发现树形dp就是入门难一些,于是好心的我便立志要发一篇树形dp入门的博客了. 树形dp的概念什么的,相信大家都已经明白,这里就不再多说.直接上例题. 一.常规树形DP P1352 没 ...

随机推荐

  1. 数据结构 -- 栈(Stack)

    一.栈的简介 定义 栈(英语:stack)又称为堆栈或堆叠,栈作为一种数据结构,它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据 ...

  2. java--键盘输入任意数字进行求和

    思路,我将键盘输入的数放入数组,然后便利数组进行求和 package com.test.day01; import java.util.Scanner; public class Test { pub ...

  3. Equations HDU - 1496(哈希的应用)

    Problem Description Consider equations having the following form: a*x1^2+b*x2^2+c*x3^2+d*x4^2=0 a, b ...

  4. dede按照权重排序dede:list和得的:arclist

    dede:list 的方法 1.找到"根目录\include\arc.listview.class.php"文件. 2.修改代码:在文件第727行处添加按weight排序判断代码( ...

  5. Timezone offset does not match system offset: 0 != -32400. Please, check your config files

    apscheduler使用uWSGI的mule模块部署的时候报错, 因为系统时区和代码运行时区不一样导致. 解决办法:在初始化的时候指定上海的时区 scheduler = BlockingSchedu ...

  6. Memcached和Spring集成开发

    xml配置文件 <bean id="memcachedPool" class="com.danga.MemCached.SockIOPool" facto ...

  7. 路由器WAN口IP显示为10、100、172开头,网络被电信联通等运营商做了NAT转发

    摘要:路由器WAN口IP显示为10.100.172开头,网络被电信联通等运营商做了NAT转发 ... 路由器WAN口IP显示为10.100.172开头的解决方法方法一:找电信(10000号)或者联通( ...

  8. Django2.0 应用 Xadmin 报错解决(转载)

    原文地址:https://blog.csdn.net/GoAheadNeverTurnBack/article/details/8143362 1.TypeError at /xadmin/    l ...

  9. ajax调用c# webservice 如何传递实体参数

    后端: 前端: 运行结果: 感觉还是比较简单,只是好久没有写webservice 了,上网找了一下写法

  10. 记录一次SourceTree无法push问题排查及解决

    1.push代码卡住,一直转圈2.试了下拉取代码也拉不到3.试了使用git命令行push可以4.使用Sourcetree新建项目,一直在检查url.5.初步判断原因,SourceTree无法联网.6. ...