题面:

农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形的土地。John打算在牧场上的某几格里种上美味的草,供他的奶牛们享用。

遗憾的是,有些土地相当贫瘠,不能用来种草。并且,奶牛们喜欢独占一块草地的感觉,于是John不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。

John想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择?(当然,把新牧场完全荒废也是一种方案)

输出一个整数,即牧场分配总方案数除以100,000,000的余数。

题解:

emmm。。。一道不难的状压DP

设f[i][j]表示到i行,状态为j的方案数,

因为相邻两块土地不能选,所以我们可以先dfs搜出所有可能状态,

这样状态数暴跌10倍,,,貌似很划得来的样子,不过不这样好像也可以,但是DP判断的地方也会麻烦一些。。。

然后存下不能放的地方,并标记为1,(同样用状压)

依次枚举行,当前状态,上一行状态,统计并取模即可

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define R register int
  4. #define AC 15
  5. #define LL long long
  6. #define mod 100000000
  7. int n,m,tmp,ans,tot;
  8. int f[AC][],s[AC],num[];//error!!!状态要开400,,,
  9.  
  10. void pre()
  11. {
  12. int a;
  13. scanf("%d%d",&n,&m);
  14. for(R i=;i<=n;i++)
  15. for(R j=;j<=m;j++)
  16. {
  17. scanf("%d",&a);
  18. if(!a) s[i] |= << (m - j);//给定状态也要压
  19. }
  20. }
  21.  
  22. void dfs(int x,int now)
  23. {
  24. if(x) tmp+= << (m - now);
  25. if(now == m)
  26. {
  27. num[++tot]=tmp;
  28. if(x) tmp-= << (m - now);
  29. return ;
  30. }
  31. if(x) dfs(,now+);
  32. else
  33. {
  34. dfs(,now+);
  35. dfs(,now+);
  36. }
  37. if(x) tmp-= << (m - now);
  38. }
  39.  
  40. void work()
  41. {
  42. for(R i=;i<=tot;i++)//第一行特殊处理
  43. {
  44. if(s[] & num[i]) continue;
  45. f[][i]=;
  46. }
  47. for(R i=;i<=n;i++)//枚举行
  48. {
  49. for(R j=;j<=tot;j++)//枚举当前行状态
  50. {
  51. if(s[i] & num[j]) continue;
  52. for(R k=;k<=tot;k++)//枚举上一行状态
  53. {
  54. if(s[i-] & num[k]) continue;
  55. if(num[j] & num[k]) continue;
  56. f[i][j] += f[i-][k];
  57. f[i][j] %= mod;
  58. //if(f[i][j] > mod) f[i][j] -= mod;
  59. }
  60. }
  61. }
  62. for(R i=;i<=tot;i++)
  63. {
  64. ans+=f[n][i];
  65. ans%=mod;
  66. //if(ans > mod) ans-=mod;
  67. }
  68. printf("%d\n",ans);
  69. }
  70.  
  71. int main()
  72. {
  73. // freopen("in.in","r",stdin);
  74. pre();
  75. dfs(,);//获取所有有效状态
  76. dfs(,);
  77. work();
  78. //fclose(stdin);
  79. return ;
  80. }

[USACO06NOV]玉米田Corn Fields 状压DP的更多相关文章

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

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

  2. [USACO06NOV]玉米田Corn Fields (状压$dp$)

    题目链接 Solution 状压 \(dp\) . \(f[i][j][k]\) 代表前 \(i\) 列中 , 已经安置 \(j\) 块草皮,且最后一位状态为 \(k\) . 同时多记录一个每一列中的 ...

  3. P1879 [USACO06NOV]玉米田Corn Fields (状压dp入门)

    题目链接: https://www.luogu.org/problemnew/show/P1879 具体思路: 我们可以先把所有合法的情况枚举出来,然后对第一行判断有多少种情况满足,然后对于剩下的行数 ...

  4. P1879 [USACO06NOV]玉米田Corn Fields(状压dp)

    P1879 [USACO06NOV]玉米田Corn Fields 状压dp水题 看到$n,m<=12$,肯定是状压鸭 先筛去所有不合法状态,蓝后用可行的状态跑一次dp就ok了 #include& ...

  5. 状压DP【洛谷P1879】 [USACO06NOV]玉米田Corn Fields

    P1879 [USACO06NOV]玉米田Corn Fields 农场主John新买了一块长方形的新牧场,这块牧场被划分成M行N列(1 ≤ M ≤ 12; 1 ≤ N ≤ 12),每一格都是一块正方形 ...

  6. 洛谷P1879 [USACO06NOV]玉米田Corn Fields(状压dp)

    洛谷P1879 [USACO06NOV]玉米田Corn Fields \(f[i][j]\) 表示前 \(i\) 行且第 \(i\) 行状态为 \(j\) 的方案总数.\(j\) 的大小为 \(0 \ ...

  7. C++ 洛谷 P1879 [USACO06NOV]玉米田Corn Fields

    没学状压DP的看一下 合法布阵问题  P1879 [USACO06NOV]玉米田Corn Fields 题意:给出一个n行m列的草地(n,m<=12),1表示肥沃,0表示贫瘠,现在要把一些牛放在 ...

  8. 洛谷 P1879 [USACO06NOV]玉米田Corn Fields 题解

    P1879 [USACO06NOV]玉米田Corn Fields 题目描述 Farmer John has purchased a lush new rectangular pasture compo ...

  9. [USACO06NOV]玉米田$Corn \ \ Fields$ (状压$DP$)

    #\(\mathcal{\color{red}{Description}}\) \(Link\) 农场主\(John\)新买了一块长方形的新牧场,这块牧场被划分成\(M\)行\(N\)列\((1 ≤ ...

随机推荐

  1. android学习九 对话框碎片

    1.android的对话框是异步的,对话框创建后马上执行下面的代码.好处:      a.通过实现对话框的回调方法反馈用户与对话框的交互.    b.能够在代码中清楚对话框.     2.碎片对话框基 ...

  2. hdu1052Tian Ji -- The Horse Racing(贪心,细节多)

    Tian Ji -- The Horse Racing Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  3. git基础(2)

    三.查看提交历史日志查看·提交历史:git log 命令一个常用的选项是 -p,用来显示每次提交的内容差异. 你也可以加上 -2 来仅显示最近两次提交如果你想看到每次提交的简略的统计信息,你可以使用 ...

  4. 【progress】 进度条组件说明

    progress 进度条组件 原型: <progress percent="[Float(0-100)]" show-info="[Boolean]" b ...

  5. 利用nohup后台运行jar文件包程序

    Linux 运行jar包命令如下: 方式一: java -jar XXX.jar特点:当前ssh窗口被锁定,可按CTRL + C打断程序运行,或直接关闭窗口,程序退出 那如何让窗口不锁定? 方式二 j ...

  6. solidity 智能合约操作

    合约编译 #!/usr/bin/env python # coding: utf8 import json import os # Solc Compiler from functools impor ...

  7. 5.azkaban权限管理

    权限简介 user 登录azkaban的用户 注意,如果不给用户roles groups,则用户就是普通用户,只能创建\查看\执行\调度自己的任务,不能看别人的 group group:用户的集合,给 ...

  8. Linux 静态和动态添加路由

    (一)静态添加 1/5 首先让我们查看当前机器的路由表,执行如下命令:route -n [root@vnode33 network-scripts]# route -n Kernel IP routi ...

  9. FZU 1844 Earthquake Damage(最大流最小割)

    Problem Description Open Source Tools help earthquake researchers stay a step ahead. Many geological ...

  10. 软工2017第四周作业结对编程——个人psp

    29.22 --9.26本周例行报告 1.PSP(personal software process )个人软件过程. 类型 任务 预计时间 开始时间                结束时间 中断时间 ...