转载请注明出处:http://blog.csdn.net/a1dark

分析:刚开始学状压DP比较困难、多看看就发现其实也没有想象中那么难、这道题由于列数较小、所以将行压缩成二进制来看、首先处理第一行、先判断同一行中不能有相邻的1出现、然后判断1出现的位置要与题目中的不冲突、接下来就是转移了、从上一行转移到这一行、首先判断上下不能有1相邻、然后就是将上一行的状态转移到当前行、上一行的所有符合条件的状态的总的方案数就是当前行该状态的方案数、

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. #define mod 100000000
  5. int M,N,top = 0;
  6. int state[600],num[110];
  7. int dp[20][600];
  8. int cur[20];
  9. bool ok(int x){//判断有没有连续的1
  10. if(x&x<<1)return 0;
  11. return 1;
  12. }
  13. void init(){
  14. top = 0;
  15. int total = 1 << N;//total种状态数
  16. for(int i = 0; i < total; ++i){
  17. if(ok(i))state[++top] = i;//如果满足状态就加入到state中
  18. }
  19. }
  20. bool fit(int x,int k){//判断状态X是否与第K行状态冲突
  21. if(x&cur[k])return 0;
  22. return 1;
  23. }
  24. int main(){
  25. while(scanf("%d%d",&M,&N)!= EOF){
  26. init();//初始化
  27. memset(dp,0,sizeof(dp));//初始化
  28. for(int i = 1; i <= M; ++i){
  29. cur[i] = 0;
  30. int num;
  31. for(int j = 1; j <= N; ++j){
  32. scanf("%d",&num);
  33. if(num == 0)cur[i] +=(1<<(N-j));
  34. }
  35. }
  36. for(int i = 1;i <= top;i++){
  37. if(fit(state[i],1)){//判断是否符合题目给定状态、
  38. dp[1][i] = 1;
  39. }
  40. }
  41. for(int i = 2; i <= M; ++i){
  42. for(int k = 1; k <= top; ++k){
  43. if(!fit(state[k],i))continue;//满足第I行和当前行的状态不冲突
  44. for(int j = 1; j <= top ;++j){
  45. if(!fit(state[j],i-1))continue;//满足第I-1行和上一行的状态不冲突、貌似可以不用
  46. if(state[k]&state[j])continue;//相邻两行的对应位置的点的0,1状态不能相同
  47. dp[i][k] = (dp[i][k] +dp[i-1][j])%mod;//从上一行转移到当前行
  48. }
  49. }
  50. }
  51. int ans = 0;
  52. for(int i = 1; i <= top; ++i){
  53. ans = (ans + dp[M][i])%mod;
  54. }
  55. printf("%d\n",ans);
  56. }
  57. }

动态规划晋级——POJ 3254 Corn Fields【状压DP】的更多相关文章

  1. POJ 3254 - Corn Fields - [状压DP水题]

    题目链接:http://poj.org/problem?id=3254 Time Limit: 2000MS Memory Limit: 65536K Description Farmer John ...

  2. POJ 3254 Corn Fields (状压dp)

    题目链接:http://poj.org/problem?id=3254 给你n*m的菜地,其中1是可以种菜的,而菜与菜之间不能相邻.问有多少种情况. 状压dp入门题,将可以种菜的状态用一个数的二进制表 ...

  3. [ An Ac a Day ^_^ ] POJ 3254 Corn Fields 状压dp

    题意: 有一块n*m的土地 0代表不肥沃不可以放牛 1代表肥沃可以放牛 且相邻的草地不能同时放牛 问最多有多少种放牛的方法并对1e8取模 思路: 典型的状压dp 能状态压缩 能状态转移 能状态压缩的题 ...

  4. Poj - 3254 Corn Fields (状压DP)(入门)

    题目链接:https://vjudge.net/contest/224636#problem/G 转载于:https://blog.csdn.net/harrypoirot/article/detai ...

  5. poj 3254 Corn Fields 状压dp入门

    题目链接 题意 在\(M\times N\)的\(0,1\)格子上放东西,只有标记为\(1\)的格子可以放东西,且相邻的格子不能同时放东西.问有多少种放法. 思路 参考:swallowblank. \ ...

  6. POJ 1684 Corn Fields(状压dp)

    描述 Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ ...

  7. POJ 3254 Corn Fields (状压入门)

    Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M≤ 12; 1 ≤ N ≤ 12) ...

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

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

  9. P1879 [USACO06NOV]玉米田Corn Fields 状压dp/插头dp

    正解:状压dp/插头dp 解题报告: 链接! ……我真的太菜了……我以为一个小时前要搞完的题目调错误调了一个小时……90分到100我差不多搞了一个小时…… 然后这题还是做过的……就很气,觉得确实是要搞 ...

随机推荐

  1. js时间戳与日期格式之间的互转

    1. 将时间戳转换成日期格式 // 简单的一句代码 var date = new Date(时间戳); //获取一个时间对象 注意:如果是uinx时间戳记得乘于1000.比如php函数time()获得 ...

  2. strcpy实现

    #include <iostream> using namespace std; char *strcpy(char *strDest, const char *strSrc) { if ...

  3. day11基础代码——函数指针

    // //  main.m //  Demo11 // //  Created by scjy on 15/10/29. //  Copyright © 2015年 lizhipeng. All ri ...

  4. SharePoint 2013 更新多个用户字段(Person or Group)

    有时我们需要更新一个用户到Person or Group类型的字段, 当然这个属性允许设置多个用户, 要如何才能添加新的用户到该字段,同时还不影响原始存在的值. 这里我们需要了解 SPFieldUse ...

  5. [转] Java 8的新特性

    简介 毫无疑问,Java 8是Java自Java 5(发布于2004年)之后的最重要的版本.这个版本包含语言.编译器.库.工具和JVM等方面的十多个新特性.在本文中我们将学习这些新特性,并用实际的例子 ...

  6. 单例模式——使用GCD实现单例模式 & 非ARC单例模式 &使用GCD和线程锁实现单例模式-b

    1.单利模式概述 链接:  iOS开发懒汉模式&恶寒模式 2.使用GCD实现单利模式 2.1新建一个project,然后新建一个HMDataTool类展示GCD实现单例模式 #import & ...

  7. nginx下搭建fastcgi的开发环境

    在上一章最简单理解CGI,FastCGI,WSGI  我们将fastcgi规范类比HTTP.下面我们通过一个案例更加明白fastcgi 我们使用的是 nginx作为前端 代理,我们包装了gevent_ ...

  8. 3、MyBatis.Net学习笔记之增删改

    增删改之前先说一下笔记1里提到的一个无法创建ISqlMapper对象的问题. <resultMaps> <resultMap id="FullResultMap" ...

  9. 【转】近百个Android优秀开源项目

    近百个Android优秀开源项目   Android开发又将带来新一轮热潮,很多开发者都投入到这个浪潮中去了,创造了许许多多相当优秀的应用.其中也有许许多多的开发者提供了应用开源项目,贡献出他们的智慧 ...

  10. BZOJ 1043 下落的圆盘

    Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求.  Input n ri xi y1 ... rn x ...