P1879 [USACO06NOV]玉米田Corn Fields

题目描述

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

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

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

输入输出格式

输入格式:

第一行:两个整数\(M\)和\(N\),用空格隔开。

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

输出格式:

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


做的第一道状压\(DP\),总结一下。

\(dp[i][j]\)表示第\(i\)行状态\(j\)(用二进制代表每一位是否种植,例如01010,就是当前行2和4种田)

转移:\(dp[i][j]=\sum dp[i-1][k]\),其中\(k\)为上一行的合法状态。

复杂度:\(O(2^{2*m}*n*m)\)

其中,两个带2的次方的是当前行的枚举和上一行的枚举,\(n\)是行数,\(m\)是检测合法。

可能会爆,要剪一下枝。

发现每一行有很多状态其实都是不合法的,所以先\(dfs\)找到每一行对自己来说的合法状态。

code

  1. #include <cstdio>
  2. #include <cstring>
  3. using namespace std;
  4. const int N=13;
  5. int dp[N][1<<N];
  6. int g[N][N],n,m,cnt=0,t0[1<<N];
  7. //第几行,第几个数字,状态,上一个数
  8. void dfs(int line,int dep,int t,int last)
  9. {
  10. if(dep==m+1)
  11. {
  12. t0[++cnt]=t;
  13. return;
  14. }
  15. if(g[line][dep]&&!last)
  16. dfs(line,dep+1,t<<1|1,1);
  17. dfs(line,dep+1,t<<1,0);
  18. }
  19. int main()
  20. {
  21. scanf("%d%d",&n,&m);
  22. for(int i=1;i<=n;i++)
  23. for(int j=1;j<=m;j++)
  24. scanf("%d",&g[i][j]);
  25. dfs(1,1,0,0);
  26. for(int i=1;i<=cnt;i++)
  27. dp[1][t0[i]]=1;
  28. for(int i=2;i<=n;i++)
  29. {
  30. cnt=0;
  31. dfs(i,1,0,0);
  32. for(int j=1;j<=cnt;j++)
  33. for(int k=0;k<=(1<<m)-1;k++)
  34. {
  35. if(!dp[i-1][k]) continue;
  36. int flag=1;
  37. for(int q=0;q<n;q++)
  38. if((t0[j]>>q)&(k>>q))
  39. {
  40. flag=0;
  41. break;
  42. }
  43. if(flag)
  44. {
  45. dp[i][t0[j]]+=dp[i-1][k];
  46. dp[i][t0[j]]%=100000000;
  47. }
  48. }
  49. }
  50. int ans=0;
  51. for(int i=1;i<=cnt;i++)
  52. {
  53. ans+=dp[n][t0[i]];
  54. ans%=100000000;
  55. }
  56. printf("%d\n",ans);
  57. return 0;
  58. }

2018.5.10

洛谷 P1879 [USACO06NOV]玉米田 解题报告的更多相关文章

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

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

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

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

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

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

  4. 洛谷P1879 [USACO06NOV]玉米田Corn Fields (状态压缩DP)

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

  5. 洛谷P1879 [USACO06NOV]玉米田Corn Fields【状压DP】题解+AC代码

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

  6. [洛谷P1879][USACO06NOV]玉米田Corn Fields

    题目大意:有一个$n\times m$的矩阵,$(1 \leq m \leq 12; 1 \leq n \leq 12)$,想在其中的一些格子中种草,一些格子不能种草,且两块草地不相邻.问有多少种种植 ...

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

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

  8. 【洛谷P1879】玉米田Corn Fields

    玉米田Corn Fields 题目链接 此题和互不侵犯状压DP的做法类似 f[i][j]表示前i行,第i行种植(1)/不种植(0)构成的二进制数为j时的方案数 首先我们可以预处理出所有一行中没有两个相 ...

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

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

随机推荐

  1. 使用Pandas_UDF快速改造Pandas代码

    1. Pandas_UDF介绍 PySpark和Pandas之间改进性能和互操作性的其核心思想是将Apache Arrow作为序列化格式,以减少PySpark和Pandas之间的开销. Pandas_ ...

  2. .NET Core在类库中读取配置文件appsettings.json

    在.NET Framework框架时代我们的应用配置内容一般都是写在Web.config或者App.config文件中,读取这两个配置文件只需要引用System.Configuration程序集,分别 ...

  3. 一个JAVA程序员成长之路分享

    我搞JAVA也有些日子了, 因为我比较贪玩,上进心不那么强, 总是逼不得已为了高薪跳槽才去学习, 所以也没混成什么大牛, 但好在现在也已经成家立业, 小日子过的还算滋润, 起码顶得住一月近万元的吃喝拉 ...

  4. Centos7.3下安装Jumpserver 1.0.0(支持windows组件)

    Jumpserver最新版本支持windows组件,废话不多介绍了,下面直接介绍下部署过程: 0)系统环境 CentOS 7.3 IP: 192.168.10.210 [root@jumpserver ...

  5. python2.6升级到3.3.0 以及依赖库在迁移时的处理

    线上服务器python版本默认是2.6,由于业务程序要求,需要将python升级到3.3.0, 操作记录如下: Cenots6.8默认安装的是2.6版本,要更新升级需安装下gcc: [root@ope ...

  6. 初学习Qt的一些感悟

    最近用Qt写了个人项目,有如下心得(可能有不准确): Qt尽管没有扩展C++语法,但是有额外编译链,每个Q_OBJECT类编译的时候会用moc工具生成另一个meta C++类,之后就是标准C++编译流 ...

  7. Linux内核第三节 20135332武西垚

    总结部分: Linux内核源代码: Arch 支持不同cpu的源代码:主要关注x86 Init   内核启动的相关代码:主要关注main.c,整个Linux内核启动代码start_kernel函数 K ...

  8. Zookeeper 3.4.8分布式安装

    1.机器信息 五台centos 64位机器 2.集群规划 Server Name Hadoop Cluster Zookeeper   Ensemble HBase Cluster Hadoop01 ...

  9. LeetCode 363:Max Sum of Rectangle No Larger Than K

    题目链接 链接:https://leetcode.com/problems/max-sum-of-rectangle-no-larger-than-k/description/ 题解&代码 1 ...

  10. Maximal GCD CodeForces - 803C (数论+思维优化)

    C. Maximal GCD time limit per test 1 second memory limit per test 256 megabytes input standard input ...