\(POJ~1038~~*Bugs~Integrated~Inc:\) (复杂的状压DP)



\(solution:\)

很纠结的一道题目,写了大半天,就想练练手,结果这手生的。其实根据之前那道炮兵阵地就不应该写的,但是总觉得自己的思路会好一些,码量又小。

博主的核心思路其实就是用一个二进制数来压缩三行的状态,因为二进制的左移右移很方便。然后就是如果三进制会很不好转移。

  1. 我们可以用一个二进制数来预处理压缩出第 \(i\) 往下三行的障碍状态,前 \(m\) 个二进制位表第 \(i\) 行,中间 \(m\) 个二进制位表 \(i+1\) 行,后 \(m\) 个二进制位表第 \(i+2\) 行

  2. 我们设一个长方体用坐上角那个点表示

  3. 我们可以用搜索来搜出一行内的长方体放置方案,这个很好写,线面代码里唯一一个手写函数就是用来求这个的。它同样用一个二进制来表示出,这个方案里三行被长方体覆盖的状况。

  4. 然后我们需要用步骤3里的单行放置方案来求出上下两行的方案拼接方案(其实就是用一个二进制将两行的方案压缩进来)。直接暴力枚举单行放置方案,再用二进制与运算来判断是否有冲突:如下

  5.      for(rg i=1;i<=tt;++i)for(rg j=1;j<=tt;++j)if(!((b[i]>>m)&b[j])){r[++st]=j; p[i][j]=st; //r表示方案的下面一行用的那个单行方案g[st]=(b[i]>>m)|b[j]; //找出两行的放置方案}
  6. 然后我们设状态就必须将前两行的状态都包含进去:设 \(f[i][j]\) 表示第 \(i\) 行前两行状态为 \(g[j]\) 意义在上面代码里

  7. 然后我们就可以开始常规转移,但是数组 \(r\) 和数组 \(p\) 一定要搞清楚!



\(code:\)

#include<iostream>
#include<cstdio>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include<cstdlib>
#include<ctime>
#include<cmath>
#include<vector>
#include<queue>
#include<map>
#include<set>#define ll long long
#define db double
#define rg register intusing namespace std;int n,m,ff,tt,st,ans;
int a[155];
int b[305];
int c[305];
int g[3005];
int r[3005];
int p[305][305];
int f[155][3005];inline void dfs(int i,int v,int vv){ //用一个二进制表示一行的状态(在某一行放,下面两行都有可能被覆盖,用一个二进制将这三行压在一起)if(i==m){b[++tt]=v; c[tt]=vv; return ;} dfs(i+1,v,vv); //导入方案if(i+3<=m)dfs(i+3,v|(7<<i)|(7<<(i+m)),vv+1); //放入横的长方体if(i+2<=m)dfs(i+2,v|(3<<i)|(3<<(i+m)|(3<<(i+m+m))),vv+1); //放入竖的长方体
}int main(){rg t; cin>>t;while(t--){cin>>n>>m>>ff; ans=0; //读入memset(a,0,sizeof(a));memset(f,0,sizeof(f));tt=0; st=0; dfs(0,0,0); //初始化for(rg i=1;i<=tt;++i)for(rg j=1;j<=tt;++j)if(!((b[i]>>m)&b[j])){r[++st]=j; p[i][j]=st; //r表示方案的下面一行用的那个单行方案g[st]=(b[i]>>m)|b[j]; //找出两行的放置方案}for(rg i=1;i<=ff;++i){rg x,y; cin>>x>>y;a[x]|=1<<(y-1);} a[n+1]=(1<<m)-1; //障碍的二进制读入,最后还要加一行障碍,防止长方体出界for(rg i=1;i<=n;++i){a[i]|=(a[i+1]<<m)|(a[i+2]<<(m+m)); //连续三行障碍压进一个二进制里for(rg j=1;j<=st;++j)for(rg k=1;k<=tt;++k)if(!(((g[j]>>m)|a[i])&b[k])){ //这一行放的方案与前面的方案还有障碍不会冲突f[i][p[r[j]][k]]=max(f[i][p[r[j]][k]],f[i-1][j]+c[k]);ans=max(ans,f[i][p[r[j]][k]]); //因为多加了一行障碍,不用怕出界}} printf("%d\n",ans);}return 0;
}

转载于:https://www.cnblogs.com/812-xiao-wen/p/11210405.html

POJ 1038 Bugs Integrated Inc (复杂的状压DP)相关推荐

  1. POJ 4979 海贼王之伟大航路 【状压dp】【北大ACM/ICPC竞赛训练】

    该死的题让我想起来艾斯之死... 首先想到dp(i)代表从1到[i表示的这些岛屿]所花的最小时间,然后每次枚举最后一个岛屿以此缩小范围,但发现枚举了最后一个岛屿后没有办法转移,因为不知道倒数第二个岛屿 ...

  2. 百练4124:海贼王之伟大航路(状压DP)

    题目来源:http://bailian.openjudge.cn/practice/4124/ 4124:海贼王之伟大航路 总时间限制: 1000ms  内存限制: 65536kB 描述 " ...

  3. POJ 2411 Mondriaan‘s Dream(最清楚好懂的状压DP讲解)(连通性状态压缩DP)

    poj 2411 Mondriaan's Dream(最清晰的状压DP解析) 闫氏DP大法好 我们这里是一列一列地来,因为是一个棋盘性的状态压缩DP,从哪个方向都一样 摆放的小方格总方案数 等价于 横 ...

  4. 【POJ 3311】Hie with the Pie(状压DP)

    Hie with the Pie 题目链接:POJ 3311 题目大意 给你 n+1 个点,其中 0 号点是特殊点. 然后两个点之间都有路径可以走. 然后你要从特殊点出发走过所有点回到特殊点,问你最短 ...

  5. POJ 1185 炮兵阵地 【状压DP】

    <题目链接> 题目大意: 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  6. POJ 1321 棋盘问题(DFS 状压DP)

    用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...

  7. POJ - 3254 Corn Fields(状压dp)

    题目链接:点击查看 题目大意:给出一个n*m的地图,有些位置不能放牧,然后放牧的条件是相邻两个格子不允许同时使用,问可行方案有几种 题目分析:因为给出的数据范围很小,并且放牧的状态是放或者不放,很容易 ...

  8. POJ - 1185 炮兵阵地(状压dp)

    题目链接:点击查看 题目大意:中文题,题意很清晰,不多赘述 题目分析:最基础的状压dp,需要考虑如何转移,因为每一个炸弹所涉及的范围都是上下左右两个格子,我们可以从第一行开始向下转移,这样某一行的状态 ...

  9. CH0103最短Hamilton路径 poj2288 Islands and Brigdes【状压DP】

    虐狗宝典学习笔记: 取出整数\(n\)在二进制表示下的第\(k\)位                                                    \((n >> ...

最新文章

  1. 5.PHP与Web页面交互
  2. 地形纹理Splatting技术(翻译)
  3. 用variance和bias解释其overfitting
  4. python 数组 indexof_Javascript Array.lastIndexOf()方法
  5. 如何加入Dave英语学习小组
  6. [流体输配管网]古罗马渡槽从水源到城市的落差估计
  7. java匿名内部对象_JavaSE 学习参考:匿名内部类和匿名对象
  8. 企业Linux安全机制遭遇信任危机 SELinux成骇客帮凶?
  9. 透视形变及其校准的方法
  10. 国产之光!Mac必备长截图软件!iShot 1.7.7中文版
  11. 这个“单”到底应该谁来买?
  12. Photon网络游戏开发——PUN2简介
  13. 博客园app for xamarin android一款简洁阅读的博客园android客户端
  14. 深度学习网络基础——感受野
  15. 【RPC】序列化与反序列化
  16. CSS系列之浏览器私有前缀
  17. 时寒冰:中国房价下跌序幕刚刚拉开
  18. Skywalking全部
  19. 《计算机组成原理》课程设计---微程序设计
  20. landsat8与sentinel2波段对比

热门文章

  1. 苹果应用商店逾千款iOS应用存安全漏洞
  2. 转:动态链接库的全局变量问题
  3. linux /etc/fstab文件参数求解释
  4. SQL删除重复数据方法
  5. scala akka_如何对Scala和Akka HTTP应用程序进行Docker化-简单的方法
  6. 捍卫者usb管理控制系统_捍卫超模块化JavaScript
  7. 手动部署OpenStack环境(一:Virtual Box 5.1 环境的安装及配置)
  8. CSS:当子元素皆浮动,撑开父元素的3种方式
  9. UI设计培训分享:app图标设计要遵循哪些原则
  10. 学习Python往哪个方向发展好