Written with StackEdit.

Description

Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行\((1<=M<=12; 1<=N<=12)\),每一格都是一块正方形的土地。FJ打算在牧场上的某几格土地里种上美味的草,供他的奶牛们享用。遗憾的是,有些土地相当的贫瘠,不能用来放牧。并且,奶牛们喜欢独占一块草地的感觉,于是FJ不会选择两块相邻的土地,也就是说,没有哪两块草地有公共边。当然,FJ还没有决定在哪些土地上种草。 作为一个好奇的农场主,FJ想知道,如果不考虑草地的总块数,那么,一共有多少种种植方案可供他选择。当然,把新的牧场荒废,不在任何土地上种草,也算一种方案。请你帮FJ算一下这个总方案数。

Input

  • 第1行: 两个正整数\(M\)和\(N\),用空格隔开
  • 第\(2..M+1\)行: 每行包含\(N\)个用空格隔开的整数,描述了每块土地的状态。输入的第\(i+1\)行描述了第i行的土地。所有整数均为\(0\)或\(1\),是\(1\)的话,表示这块土地足够肥沃,\(0\)则表示这块地上不适合种草.

Output

第\(1\)行: 输出一个整数,即牧场分配总方案数除以\(100000000\)的余数

Sample Input

2 3

1 1 1

0 1 0

Sample Output

9

Solution

  • 状压\(dp\)的入门题.
  • 注意每一行有共同的限制,即不能有相邻的.可以预处理此条件下合法的方案,转移时再加上其他限制即可.
  • 可以滚成一维,但没必要.
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. typedef long long LoveLive;
  4. inline int read()
  5. {
  6. int out=0,fh=1;
  7. char jp=getchar();
  8. while ((jp>'9'||jp<'0')&&jp!='-')
  9. jp=getchar();
  10. if (jp=='-')
  11. {
  12. fh=-1;
  13. jp=getchar();
  14. }
  15. while (jp>='0'&&jp<='9')
  16. {
  17. out=out*10+jp-'0';
  18. jp=getchar();
  19. }
  20. return out*fh;
  21. }
  22. const int P=1e8;
  23. inline int add(int a,int b)
  24. {
  25. return (a + b) % P;
  26. }
  27. inline int mul(int a,int b)
  28. {
  29. return 1LL * a * b % P;
  30. }
  31. const int MAXN=13;
  32. const int MAXS=1<<13;
  33. int n,m;
  34. int fix[MAXN][MAXN];
  35. int f[MAXN][MAXS];
  36. int g[MAXS],tot=0;
  37. vector<int> G[MAXN];
  38. inline int judge(int st)
  39. {
  40. int ls=0;
  41. while(st)
  42. {
  43. int p=st&1;
  44. if(p && ls)
  45. return 0;
  46. ls=p;
  47. st>>=1;
  48. }
  49. return 1;
  50. }
  51. int check(int cur,int r)
  52. {
  53. int cnt=1;
  54. while(cur)
  55. {
  56. int p=cur&1;
  57. if(p && fix[r][cnt]==0)
  58. return 0;
  59. ++cnt;
  60. cur>>=1;
  61. }
  62. return 1;
  63. }
  64. int main()
  65. {
  66. n=read(),m=read();
  67. for(int i=1;i<=n;++i)
  68. for(int j=1;j<=m;++j)
  69. fix[i][j]=read();
  70. int S=1<<m;
  71. for(int i=0;i<S;++i)
  72. if(judge(i))
  73. g[++tot]=i;
  74. G[0].push_back(0);
  75. f[0][0]=1;
  76. int ans=0;
  77. for(int i=1;i<=n;++i)
  78. {
  79. int sizls=G[i-1].size();
  80. for(int p=1;p<=tot;++p)
  81. {
  82. int st=g[p];
  83. if(check(st,i))
  84. {
  85. G[i].push_back(st);
  86. for(int j=0;j<sizls;++j)
  87. {
  88. int k=G[i-1][j];
  89. if(!(st&k))
  90. f[i][st]=add(f[i][st],f[i-1][k]);
  91. }
  92. }
  93. if(i==n)
  94. ans=add(ans,f[i][st]);
  95. }
  96. }
  97. printf("%d\n",ans);
  98. return 0;
  99. }

bzoj 1725 Corn Fields的更多相关文章

  1. BZOJ1725: [Usaco2006 Nov]Corn Fields牧场的安排

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 400  Solved: 290 ...

  2. bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排(状压dfs)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1122  Solved: 80 ...

  3. bzoj1725 [Usaco2006 Nov]Corn Fields牧场的安排(状压dp)

    1725: [Usaco2006 Nov]Corn Fields牧场的安排 Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 714  Solved: 502 ...

  4. POJ 3254. Corn Fields 状态压缩DP (入门级)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 9806   Accepted: 5185 Descr ...

  5. 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP

    [BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...

  6. poj 3254 Corn Fields

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

  7. Corn Fields——POJ3254状态压缩Dp

    Corn Fields Time Limit: 2000MS Memory Limit: 65536K Description Farmer John has purchased a lush new ...

  8. poj3254 Corn Fields (状压DP)

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

  9. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

随机推荐

  1. 对于C++指针的详细理解

    (1)每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址.  eg: int var1; &var1  表示var1的地址 ...

  2. [转]hadoop2.x常用端口及定义方法

    端口 Hadoop集群的各部分一般都会使用到多个端口,有些是daemon之间进行交互之用,有些是用于RPC访问以及HTTP访问.而随着Hadoop周边组件的增多,完全记不住哪个端口对应哪个应用,特收集 ...

  3. 使用POI做的一个生成Excel的工具类。包含了导出Excel和解析Excel方法

    PoiExcelUtils.java /** * */ package com.common.office; import java.io.File; import java.io.FileInput ...

  4. Secondary ,Supplementary alignment 和bwa mem的-M -Y参数

    1.supplementary alignment supplementary alignment是指一条read的一部分和参考区域1比对成功,另一部分和参考区域2比对成功,参考区域1和参考区域2没有 ...

  5. MapReduce:实现文档倒序排序,且字符串拼接+年+月+日

    写出MapReduce程序完成以下功能. input1: -- a -- b -- c -- d -- a -- b -- c -- c input2: -- b -- a -- b -- d -- ...

  6. camera frame work v3 note

    1 android_atomic_write(level, &gLogLevel); 原子写操作. 2 构造函数和onFirstRef onFirstRef 会在构造函数运行后执行,这个是在m ...

  7. [BZOJ1823]满汉全席

    Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而 ...

  8. how to create an asp.net web api project in visual studio 2017

    https://docs.microsoft.com/en-us/aspnet/web-api/overview/getting-started-with-aspnet-web-api/tutoria ...

  9. Winform与WPF异步修改控件属性

    Winform方式:     if (this.InvokeRequired)             {                 this.Invoke(                   ...

  10. codeforces 816B.Karen and Coffee 解题报告

    题目链接:http://codeforces.com/contest/816/problem/B 题目意思:给出 n 个recipes,第 i 个(1<= i <=n)recipes 表明 ...