http://poj.org/problem?id=3254

从这里学的 http://blog.csdn.net/accry/article/details/6607703

状压dp的入门题。一片N×M的田地,有的地方可以种玉米,有的地方不可以。种玉米的区块不能相邻。种玉米的求总方案数,不种玉米也是一种方案。

每一行总共2^N种状态,其中删去有相邻的状态,删除不符合给定条件的状态。保留下最终的所有状态。然后开始dp。

从上往下,每一行之依赖于上一行。所以从上一行转移过去,把状态数加起来就行了。

其中几个函数写的比较精妙,结合二进制运算理解一下并不难。

  1. /*--------------------------------------------------------------------------------------*/
  2. // Helica's header
  3. // Second Editions
  4. // 2015.11.7
  5. //
  6. #include <algorithm>
  7. #include <iostream>
  8. #include <cstring>
  9. #include <ctype.h>
  10. #include <cstdlib>
  11. #include <cstdio>
  12. #include <vector>
  13. #include <string>
  14. #include <queue>
  15. #include <stack>
  16. #include <cmath>
  17. #include <set>
  18. #include <map>
  19.  
  20. //debug function for a N*M array
  21. #define debug_map(N,M,G) printf("\n");for(int i=0;i<(N);i++)\
  22. {for(int j=;j<(M);j++){\
  23. printf("%d",G[i][j]);}printf("\n");}
  24. //debug function for int,float,double,etc.
  25. #define debug_var(X) cout<<#X"="<<X<<endl;
  26. /*--------------------------------------------------------------------------------------*/
  27. using namespace std;
  28.  
  29. const int MOD = ;
  30. int N,M,T;
  31. int dp[][],state[],cur[];
  32. int cnt;
  33. bool ok(int x)
  34. {
  35. if(x&(x<<)) return ;
  36. return ;
  37. }
  38.  
  39. bool fit(int s,int c)
  40. {
  41. if(s&c) return ;
  42. return ;
  43. }
  44.  
  45. int main()
  46. {
  47. while(~scanf("%d%d",&N,&M))
  48. {
  49. for(int i=;i<=N;i++)
  50. {
  51. cur[i] = ;
  52. for(int j=;j<=M;j++)
  53. {
  54. int a;
  55. scanf("%d",&a);
  56. if(a==) cur[i] += (<<(M-j));
  57. }
  58. }
  59. cnt=;
  60. for(int i=;i < <<M;i++) if(ok(i))
  61. {
  62. state[++cnt] = i;
  63. }
  64.  
  65. memset(dp,,sizeof dp);
  66. for(int i=;i<=cnt;i++) if(fit(state[i],cur[]))
  67. dp[][i] = ;
  68.  
  69. for(int i=;i<=N;i++)
  70. {
  71. for(int j=;j<=cnt;j++)
  72. {
  73. if(!fit(state[j],cur[i])) continue;
  74. for(int k=;k<=cnt;k++)
  75. {
  76. if(!fit(state[k],cur[i-])) continue;
  77. if(state[j]&state[k]) continue;
  78. dp[i][j] = (dp[i][j]+dp[i-][k])%MOD;
  79. }
  80. }
  81. }
  82. int ans = ;
  83. for(int i=;i<=cnt;i++) ans = (ans+dp[N][i])%MOD;
  84. printf("%d\n",ans);
  85. }
  86. }

睡前小dp-poj3254-状压dp入门的更多相关文章

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

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

  2. dp乱写1:状态压缩dp(状压dp)炮兵阵地

    https://www.luogu.org/problem/show?pid=2704 题意: 炮兵在地图上的摆放位子只能在平地('P') 炮兵可以攻击上下左右各两格的格子: 而高原('H')上炮兵能 ...

  3. poj2411 Mondriaan's Dream (轮廓线dp、状压dp)

    Mondriaan's Dream Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 17203   Accepted: 991 ...

  4. poj3254状压DP入门

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

  5. POJ3254 状压dp

                                                                                                    Corn ...

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

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

  7. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...

  8. hoj 2662 经典状压dp // MyFirst 状压dp

    题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...

  9. 【BZOJ3925】地震后的幻想乡(期望概率DP,状压DP)

    题意:给定一张点数不超过10的无向连通图,每条边有一个[0,1]之间的随机权值,求最小生成树上最大边的期望值 提示:对于n个[0,1]之间的随机变量x1,x2,...,xn,第k小的那个的期望值是k/ ...

  10. hdu4352 XHXJ's LIS[数位DP套状压DP+LIS$O(nlogn)$]

    统计$[L,R]$内LIS长度为$k$的数的个数,$Q \le 10000,L,R < 2^{63}-1,k \le 10$. 首先肯定是数位DP.然后考虑怎么做这个dp.如果把$k$记录到状态 ...

随机推荐

  1. 《Google软件测试之道》测试工程师

    愿和我一样读过这本书的人有所共鸣或者启发,愿没读过这本书的人,能获得一点点收获... 说到软件测试工程师,首先我们需要明白一个问题,软件测试工程师的职责是什么? 关于这个话题,不同的人有不同的定义:抛 ...

  2. jmeter(十九)HTTP属性管理器

    jmeter是一个开源灵活的接口和性能测试工具,当然也能利用jmeter进行接口自动化测试.在我们利用它进行测试过程中,最常用的sampler大概就是Http Request, 使用这个sampler ...

  3. C++11 并发指南二(std::thread 详解)

    上一篇博客<C++11 并发指南一(C++11 多线程初探)>中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用 ...

  4. Luogu3162 CQOI2012 组装 贪心

    传送门 如果提供每一种零件的生产车间固定了,那么总时间\(t\)与组装车间的位置\(x\)的关系就是 \(t = \sum (x-a_i)^2 = nx^2-2\sum a_ix + \sum a_i ...

  5. WPF中的Bitmap与byte

    原文:WPF中的Bitmap与byte public MainWindow() { InitializeComponent(); byte[] b = GetPictureData(@"F: ...

  6. WPF 任务栏背景闪烁提醒

    原文:WPF 任务栏图标闪烁提醒   public static class FlashWindow { [DllImport("user32.dll")] [return: Ma ...

  7. C# 泛型分组和Linq分组的异同

    没什么好说的,因为用的到,所以作个记录, 代码如下: using System; using System.Collections.Generic; using System.Linq; using ...

  8. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

  9. 2091: [Poi2010]The Minima Game

    2091: [Poi2010]The Minima Game 链接 分析: 首先排序后,一定是选的连续的一段. f[i]表示前i个位置,先手-后手的最大得分. 那么考虑第i个位置是否选,如果选,先手选 ...

  10. 12.13 Daily Scrum

    现在已经可以实现在应用中直接通过WebView浏览餐厅的网页,而不用再调用手机的浏览器. 收藏夹的功能也基本实现,接下来的目标时将收藏夹与每一个用户关联.   Today's Task Tomorro ...