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 解题报告的更多相关文章

  1. 洛谷 P1462 解题报告

    P1462 通往奥格瑞玛的道路 题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡 ...

  2. 洛谷 P1069 解题报告

    P1069 细胞分裂 题目描述 \(Hanks\)博士是\(BT\) (\(Bio-Tech\),生物技术) 领域的知名专家.现在,他正在为一个细胞实验做准备工作:培养细胞样本. \(Hanks\) ...

  3. 洛谷 P2491 解题报告

    P2491 消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情,所以这个 ...

  4. 洛谷 P2587 解题报告

    P2587 [ZJOI2008]泡泡堂 题目描述 第XXXX届NOI期间,为了加强各省选手之间的交流,组委会决定组织一场省际电子竞技大赛,每一个省的代表队由n名选手组成,比赛的项目是老少咸宜的网络游戏 ...

  5. 洛谷 P1054 解题报告

    P1054 等价表达式 题目描述 明明进了中学之后,学到了代数表达式.有一天,他碰到一个很麻烦的选择题.这个题目的题干中首先给出了一个代数表达式,然后列出了若干选项,每个选项也是一个代数表达式,题目的 ...

  6. 洛谷 P1053 解题报告

    P1053 篝火晚会 题目描述 佳佳刚进高中,在军训的时候,由于佳佳吃苦耐劳,很快得到了教官的赏识,成为了"小教官".在军训结束的那天晚上,佳佳被命令组织同学们进行篝火晚会.一共有 ...

  7. 洛谷 P1057 解题报告

    P1057 传球游戏 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏. 游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹 ...

  8. 洛谷 P1430 解题报告

    P1430 序列取数 题目描述 给定一个长为\(n\)的整数序列\((n<=1000)\),由\(A\)和\(B\)轮流取数(\(A\)先取).每个人可从序列的左端或右端取若干个数(至少一个), ...

  9. 洛谷 P1613 解题报告

    P1613 跑路 题目描述 小\(A\)的工作不仅繁琐,更有苛刻的规定,要求小\(A\)每天早上在\(6:00\)之前到达公司,否则这个月工资清零.可是小\(A\)偏偏又有赖床的坏毛病.于是为了保住自 ...

随机推荐

  1. 【一天一道LeetCode】#40. Combination Sum II

    一天一道LeetCode系列 (一)题目 Given a collection of candidate numbers (C) and a target number (T), find all u ...

  2. UML之活动图

    活动图,她的英文名字叫Activity Diagram,是一种说明业务用例实现的工作流程,活动图是UML大家族中用于对系统的动态方面建模的无中图之一. 举个简单的例子,以建房的工作流为例,首先,我们要 ...

  3. Java进阶(五十二)利用LOG4J生成服务日志

    Java进阶(五十二)利用LOG4J生成服务日志 前言 由于论文写作需求,需要进行流程挖掘.前提是需要有真实的事件日志数据.真实的事件日志数据可以用来发现.监控和提升业务流程. 为了获得真实的事件日志 ...

  4. 地产IT人福利:帆软地产BI解决方案全解析

    解决方案下载地址 帆软大型地产集团项目解决方案 下载地址:http://pan.baidu.com/s/1pJGeqKF帆软地产BI解决方案之KPI考核系统 下载地址:http://pan.baidu ...

  5. HBase丢失数据的故障和原因分析

    hbase的稳定性是近期社区的重要关注点,毕竟稳定的系统才能被推广开来,这里有几次稳定性故障和大家分享.     第一次生产故障的现象及原因     现象: 1 hbase发现无法写入 2 通过hbc ...

  6. OpenCV+OpenCL stereo match 代码

    之前配置cuda跟opencv 的混合编程,发现只要使用的东西多半还要用opencv的代码编译一次,加上cuda的编译太浪费时间了,我看了几个博客,觉的opencl这个可能会比较好整,就把opencv ...

  7. 【Android 应用开发】Activity生命周期 与 Activity 之间的通信

    一. Activity生命周期 上图 1. Activity状态 激活状态 : Activity出于前台 , 栈顶位置; 暂停状态 : 失去了焦点 , 但是用户仍然可以看到 , 比如弹出一个对话框 , ...

  8. Windows核心编程读书笔记1

    今天特别困啊,这是为什么?!!刚刚把第一章看了一下,困到不行,所以写blog清醒一下. 第一章标题是“错误处理”,看了之后吓了一跳,难道第一章就讲这么高大上的东西?!不是不是,我现在的理解是,这章主要 ...

  9. Spring Boot 2.0系列文章(七):SpringApplication 深入探索

    关注我 转载请务必注明原创地址为:http://www.54tianzhisheng.cn/2018/04/30/springboot_SpringApplication/ 前言 在 Spring B ...

  10. java多继承

    众所周知,java面向对象语言中只有单继承的编程语言,也许你会说,通过实现多个接口这种变通的方式达到多继承的目的.没错,你说的对,不过这并不是本片文章要说到的内容,本文要讲到的内容是java中实实在在 ...