题目连接:http://poj.org/problem?id=3254

题意:一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻。问有多少种放牛方案(一头牛都不放也是一种方案)

分析:dp[i][state]表示状态为state,到达i行时符合条件的总方案数,则dp[i][state]=sigma(dp[i-1][state'])state'为符合条件的状态。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <string>
  4. #include <cmath>
  5. #include <iostream>
  6. #include <algorithm>
  7. #include <queue>
  8. #include <cstdlib>
  9. #include <stack>
  10. #include <vector>
  11. #include <set>
  12. #include <map>
  13. #define LL long long
  14. #define mod 100000000
  15. #define inf 0x3f3f3f3f
  16. #define eps 1e-9
  17. #define N 100010
  18. #define FILL(a,b) (memset(a,b,sizeof(a)))
  19. #define lson l,m,rt<<1
  20. #define rson m+1,r,rt<<1|1
  21. using namespace std;
  22. int dp[][],n,m,tot;
  23. int cur[],state[];
  24. void init()//预处理出每行所有符合条件的状态
  25. {
  26. int sum=<<m;
  27. tot=;
  28. for(int i=;i<sum;i++)
  29. {
  30. if(!(i&(i<<)))state[++tot]=i;
  31. }
  32. }
  33. bool ok(int state,int k)//判断状态state在k行时是否符合条件
  34. {
  35. if(state&cur[k])return ;
  36. return ;
  37. }
  38. int main()
  39. {
  40. while(scanf("%d%d",&n,&m)>)
  41. {
  42. init();
  43. for(int i=;i<=n;i++)
  44. {
  45. cur[i]=;
  46. for(int j=;j<=m;j++)
  47. {
  48. int x;
  49. scanf("%d",&x);
  50. if(!x)cur[i]+=<<(m-j);//记录每行不能放牛的状态
  51. }
  52. }
  53. FILL(dp,);
  54. for(int i=;i<=tot;i++)
  55. {
  56. if(ok(state[i],))dp[][i]=;
  57. }
  58. for(int i=;i<=n;i++)
  59. {
  60. for(int j=;j<=tot;j++)
  61. {
  62. if(!ok(state[j],i))continue;
  63. for(int k=;k<=tot;k++)
  64. {
  65. if(!ok(state[k],i-))continue;
  66. if(state[j]&state[k])continue;
  67. dp[i][j]+=dp[i-][k];
  68. dp[i][j]%=mod;
  69. }
  70. }
  71. }
  72. int ans=;
  73. for(int i=;i<=tot;i++)
  74. ans=(ans+dp[n][i])%mod;
  75. printf("%d\n",ans);
  76. }
  77. }

poj3254(状压dp)的更多相关文章

  1. poj3254状压DP入门

    G - 状压dp Crawling in process... Crawling failed Time Limit:2000MS     Memory Limit:65536KB     64bit ...

  2. POJ3254 状压dp

                                                                                                    Corn ...

  3. 【POJ3254】Corn Fields(状压DP)

    题意: 一个M x N矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧,可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方格不能同时放牛,即牛与牛不能相邻.问有多少种放牛方案( ...

  4. 【POJ3254】Corn Fields 状压DP第一次

    !!!!!!! 第一次学状压DP,其实就是运用位运算来实现一些比较,挺神奇的.. 为什么要发“!!!”因为!x&y和!(x&y)..感受一下.. #include <iostre ...

  5. poj3254 Corn Fields (状压DP)

    http://poj.org/problem?id=3254 Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissio ...

  6. POJ3254 Corn Fields(状压DP)

    题目给个n×m的地图,1可以放玉米0不可以,现在要放玉米,玉米上下左右不能相邻,问放法有几种. 当前一行的决策只会影响下一行,所以状压DP之: dp[i][S]表示前i行放完且第i行放玉米的列的集合是 ...

  7. poj3254:基础状压dp

    第二个状压dp 做过的第一个也是放牛问题,两头牛不能相邻 这个题多了一个限制,就是有些位置不能放牛 于是先与处理一下每一行所有不能放牛的状态,处理的过程直接对每一个不能放牛的状态或以下 ac代码: # ...

  8. 状压dp入门

    状压dp的含义 在我们解决动态规划题目的时候,dp数组最重要的一维就是保存状态信息,但是有些题目它的具有dp的特性,并且状态较多,如果直接保存的可能需要三维甚至多维数组,这样在题目允许的内存下势必是开 ...

  9. dp,状压dp等 一些总结

    也就作业几题而已,分析一下提醒 最重要的就是,记住,没用的状态无论怎么转移最后都会是没用的状态,所以每次转移以后的有值的状态都是有用的状态. 几种思考方向: 第一种:枚举当前的状态,转移成另外一个状态 ...

  10. 算法复习——状压dp

    状压dp的核心在于,当我们不能通过表现单一的对象的状态来达到dp的最优子结构和无后效性原则时,我们可能保存多个元素的有关信息··这时候利用2进制的01来表示每个元素相关状态并将其压缩成2进制数就可以达 ...

随机推荐

  1. 6.MIL采集和实时显示

    前面讲到的都是离线的图像获取方法,实际中我们做机器视觉都是在线采集图像和处理,处理结果决定了计算机要给出的控制信号如电机运动等,这样就实现了实时视觉反馈运动.MIL中的采集需要Matrox采集板卡的支 ...

  2. 24篇HTTP博客

    http://www.cppblog.com/woaidongmao/category/11721.html

  3. POJ 2175 spfa费用流消圈

    题意:给出n栋房子位置和每栋房子里面的人数,m个避难所位置和每个避难所可容纳人数.然后给出一个方案,判断该方案是否最优,如果不是求出一个更优的方案. 思路:很容易想到用最小费用流求出最优时间,在与原方 ...

  4. C# - 使用 List<> 泛型给GridView控件数据

    创建实体模型: namespace Test.Models { public class Student { public string ID { get; set; } public string ...

  5. Selenium Webdriver firefox 浏览器问题

    Selenium Webdriver 在使用firefox 测试会牵扯到firefox的安装路径的问题 1.默认安装路径在c盘的情况下: WebDriver driver = new FirefoxD ...

  6. 有空研究一下OwnerDraw和三种Windows风格CS_OWNDC和CS_PARENTDC和CS_CLASSDC

    就在StdCtrls.pas, ExtCtrls.pas和Buttons.pas三个类里研究就够了,这是初步的搜索结果: ---------- 在打开的文档中查找 ---------- "G ...

  7. javascript事件委托,事件代理,元素绑定多个事件之练习篇

    <ul id="parent-list"> <li id="post-1">item1</li> <li id=&qu ...

  8. HDU2504 又见GCD

    又见GCD Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Subm ...

  9. HashSet的排序

    import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; import java.util ...

  10. ExtJs4 笔记(8) Ext.slider 滚轴控件、 Ext.ProgressBar 进度条控件、 Ext.Editor 编辑控件

    本篇要登场的有三个控件,分别是滚轴控件.进度条控件和编辑控件. 一.滚轴控件 Ext.slider 1.滚轴控件的定义 下面我们定义三个具有代表意义滚轴控件,分别展示滚轴横向.纵向,以及单值.多值选择 ...