(1) 最简单的4^10*N的枚举(理论上20%)

(2) 优化优化200^3*N的枚举(理论上至少50%)

(3) Dfs优化状压dp O(我不知道,反正过不了,需要再优化)(理论上80%)

(4) 再剩下的,卡常数+卡常数+一个小优化(自己想吧,有可能被卡一个点)

(5) 如果还没有过,dfs中可能有重复的状态,用链式前向星优化一下,就差不多了

(6) 以上属于乱搞,正解在下面

(7) O(3^10*N),我们知道,设,我们更新第i行的状态,那么如果第i-1行的第j个位置不能被选取,则第i-2行的第j个位置同样不可以被选取,那么4^N状态转化为3^N,理论时间复杂度可能会超时(这个大概是60-70%的样子),所以需要用到Dfs优化(这个大概70-100%,有的人就能,反正我没有),之后同样,用链式前向星优化一下,就可以过了,当然,如果你还不满足于这个时间复杂度的话,还可以继续优化,这个就不写在这里了。

乱搞程序

  1. #include <cstdio>
  2. #include <cmath>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <iostream>
  6. #include <cstdlib>
  7. #include <queue>
  8. using namespace std;
  9. #define N 155
  10. #define M 205
  11. #define max(a,b) ((a)<(b)?(b):(a))
  12. int f[3][M][M],cur[N],n,m,K,can[M],p[1<<15],cnt2,head[M][M];
  13. int to[M*M*30],to2[M*M*30],to3[M*M*30],cnt[M*M*30],next[M*M*30];
  14. int a,b,ans,cnt4;
  15. void dfs(int f1,int f2,int step,int f3,int cnt1)
  16. {
  17. if(to[cnt4]!=f1||to3[cnt4]!=f2)
  18. {
  19. to[++cnt4]=f1;
  20. to2[cnt4]=f3;
  21. to3[cnt4]=f2;
  22. cnt[cnt4]=cnt1;
  23. next[cnt4]=head[a][b];
  24. head[a][b]=cnt4;
  25. }
  26. if(step>=m)return ;
  27. if(step<m-1&&!(f1&(3<<step))&&!(f2&(3<<step)))
  28. {
  29. dfs(f1|(3<<step),f2|(3<<step),step+2,f3|(3<<step),cnt1+1);
  30. }
  31. if(step<m-2&&!(f1&(7<<(step))))
  32. {
  33. dfs(f1|(7<<step),f2,step+3,f3|(7<<step),cnt1+1);
  34. }
  35. if(step<m-2&&!(f1&(7<<step))&&!(f2&(7<<step)))
  36. {
  37. dfs(f1|(7<<step),f2|(7<<step),step+3,f3,cnt1+1);
  38. }
  39. dfs(f1,f2,step+1,f3,cnt1);
  40. return ;
  41. }
  42. void init()
  43. {
  44. memset(cur,0,sizeof(cur));
  45. memset(head,0,sizeof(head));
  46. cnt4=0;
  47. }
  48. int main()
  49. {
  50. int T;
  51. scanf("%d",&T);
  52. while(T--)
  53. {
  54. init();
  55. scanf("%d%d%d",&n,&m,&K);
  56. int mask=(1<<m)-1;
  57. for(int i=1;i<=K;i++)
  58. {
  59. int x,y;
  60. scanf("%d%d",&x,&y);
  61. cur[x]|=(1<<(y-1));
  62. }
  63. cur[0]=cur[n+1]=mask;
  64. ans=0;cnt2=0;
  65. for(int j=0;j<=mask;j++)
  66. {
  67. int s=j;
  68. if(((s&3)==1)||(s!=0&&((((~s))&((~s)<<2))&&(((((~s))&((((~s)))<<2))>>1)&s))))continue;
  69. can[++cnt2]=j;
  70. p[j]=cnt2;
  71. }
  72. for(int i=1;i<=cnt2;i++)
  73. {
  74. for(int j=1;j<=cnt2;j++)
  75. {
  76. if((can[i]&can[j])!=can[i])continue;
  77. a=i,b=j;
  78. dfs(can[i],can[j],0,0,0);
  79. }
  80. }
  81. memset(f[1],0,sizeof(f[1]));
  82. for(int i=1;i<n;i++)
  83. {
  84. memset(f[(i+1)&1],0,sizeof(f[(i+1)&1]));
  85. for(int j=1;j<=cnt2;j++)
  86. {
  87. if(can[j]&cur[i])continue;
  88. for(int k=j;k<=cnt2;k++)
  89. {
  90. if((can[k]&cur[i-1]))continue;
  91. if((can[k]&can[j])!=can[j])continue;
  92. for(int l=head[j][k];l;l=next[l])
  93. {
  94. if((to[l]&cur[i])||(to3[l]&cur[i-1])||(to2[l]&cur[i+1]))continue;
  95. f[(i^1)&1][p[to2[l]]][p[to[l]|to2[l]]]=max(f[(i^1)&1][p[to2[l]]][p[to[l]|to2[l]]],f[i&1][j][k]+cnt[l]);
  96. }
  97. if(i==1)break;
  98. }
  99. }
  100. for(int j=1;j<=cnt2;j++)
  101. {
  102. for(int k=1;k<=cnt2;k++)
  103. {
  104. ans=max(ans,f[(i+1)&1][j][k]);
  105. }
  106. }
  107. }
  108. printf("%d\n",ans);
  109. }
  110. return 0;
  111. }

  

POJ1038 Bugs Integrated, Inc 状压DP+优化的更多相关文章

  1. poj1038 Bugs Integrated,Inc. (状压dp)

    题意:N*M的矩阵,矩阵中有一些坏格子,要在好格子里铺2*3或3*2的地砖,问最多能铺多少个. 我的方法好像和网上流传的方法不太一样...不管了.... 由数据范围很容易想到状压dp 我们设某个状态的 ...

  2. POJ 1038 Bugs Integrated, Inc. ——状压DP

    状态压缩一下当前各格子以及上面总共放了几块,只有012三种情况,直接三进制保存即可. 然后转移的时候用搜索找出所有的状态进行转移. #include <map> #include < ...

  3. POJ1038 - Bugs Integrated, Inc.(状态压缩DP)

    题目大意 要求你在N*M大小的主板上嵌入2*3大小的芯片,不能够在损坏的格子放置,问最多能够嵌入多少块芯片? 题解 妈蛋,这道题折腾了好久,黑书上的讲解看了好几遍才稍微有点眉目(智商捉急),接着看了网 ...

  4. poj 1185 状压dp+优化

    http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 291 ...

  5. poj2411 Mondriaan's Dream[简单状压dp]

    $11*11$格子板上铺$1*2$地砖方案.以前做过?权当复习算了,毕竟以前学都是浅尝辄止的..常规题,注意两个条件:上一行铺竖着的则这一行同一位一定要铺上竖的,这一行单独铺横的要求枚举集合中出现连续 ...

  6. HDUOJ Clear All of Them I 状压DP

    Clear All of Them I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 122768/62768 K (Java/Oth ...

  7. POJ 1038 Bugs Integrated Inc (复杂的状压DP)

    $ POJ~1038~~\times Bugs~Integrated~Inc: $ (复杂的状压DP) $ solution: $ 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前 ...

  8. bzoj2004 矩阵快速幂优化状压dp

    https://www.lydsy.com/JudgeOnline/problem.php?id=2004 以前只会状压dp和矩阵快速幂dp,没想到一道题还能组合起来一起用,算法竞赛真是奥妙重重 小Z ...

  9. 【bzoj1097】[POI2007]旅游景点atr 状压dp+堆优化Dijkstra

    题目描述 FGD想从成都去上海旅游.在旅途中他希望经过一些城市并在那里欣赏风景,品尝风味小吃或者做其他的有趣的事情.经过这些城市的顺序不是完全随意的,比如说FGD不希望在刚吃过一顿大餐之后立刻去下一个 ...

随机推荐

  1. 手动编译Flume

    1.源码下载: 我用的是1.6版,因为加了kafka-sink,下载地址 http://www.apache.org/dyn/closer.cgi/flume/1.6.0/apache-flume-1 ...

  2. SpringBoot集成jsp

    一.springBoot集成jsp: 1.修改pom文件 <!--集成jsp所需jar包--> <!--jsp页面使用jstl标签--> <dependency> ...

  3. python单线程,多线程和协程速度对比

    在某些应用场景下,想要提高python的并发能力,可以使用多线程,或者协程.比如网络爬虫,数据库操作等一些IO密集型的操作.下面对比python单线程,多线程和协程在网络爬虫场景下的速度. 一,单线程 ...

  4. Mybatis 系列4

    上篇系列3中 介绍了properties与environments, 本篇继续讲剩下的配置节点之一:typeAliases. typeAliases节点主要用来设置别名,其实这是挺好用的一个功能, 通 ...

  5. 2017年最适用于WIFI HACK的无线网卡推荐

    http://www.freebuf.com/articles/wireless/140065.html 相信很多初次使用Kali Linux来进行无线渗透的小伙伴都曾遇到过一个非常头疼的问题,就是不 ...

  6. java内存溢出(二)

    一.有哪些内存溢出异常? OutOfMemoryError: 当堆.栈(多线程场景).方法区(永久区).本地内存(元数据.直接内存),数据容量达到最大时产生 StackOverFlowError: 线 ...

  7. ubuntu 18.04安装docker以及docker内配置neo4j

    如题 切换到root用户下 apt install docker.io 等啊等,很快,就好了.. 如图 即可使用 如果出现Cannot connect to the Docker daemon at ...

  8. SOFA 源码分析 — 链路数据透传

    前言 SOFA-RPC 支持数据链路透传功能,官方解释: 链路数据透传功能支持应用向调用上下文中存放数据,达到整个链路上的应用都可以操作该数据. 使用方式如下,可分别向链路的 request 和 re ...

  9. UE4笔记:利用Widget设计一个切换材质功能

    UE4引擎中的Widget蓝图是一个重要的工具,可用于场景中的页面叠加,镜头绑定,场景切换等多处地方,在这里笔者介绍一种利用控件蓝图和场景中物体进行信息交互的方法,直观的体现就是进行物体的材质切换. ...

  10. Myeclipse+selenium2.0+Junit+TestNg环境搭建

    这周末把自动化的环境搭好了,在网上也百度了很多,现在分享下,希望大家少走一点歪路. 需要用到的安装包都在这个里面,自取: 链接:https://pan.baidu.com/s/10ohf757ztgN ...