Bugs Integrated, Inc.】的更多相关文章

题意:n*m方格,有些格子有黑点,问你最多裁处几张2 * 3(3 * 2)的无黑点格子. 思路:我们放置2 * 3格子时可以把状态压缩到三进制: 关于状压:POJ-1038 Bugs Integrated, Inc. (状压+滚动数组+深搜 的动态规划),写的很详细 所以我们直接枚举每一行的所有可能状态,并算出每种状态最大值.这样我们到最后只要找到n行所有状态最大值就行了. 代码: #include<cmath> #include<stack> #include<queue&…
题目来源:http://poj.org/problem?id=1038 题目大意: 有一家芯片公司要在一块N*M的板子上嵌入芯片,其中1<=N<=150, 1<=M<=10,但是板子上有一些格子是坏的,不能放置芯片.芯片的面积是2*3,可以横着放也可以竖着放,但不能有重叠.如下图所示: 现给出N M和坏点的坐标,求最多能在板子上嵌入多少芯片. 输入:第一行测试用例数,每例第一行三个整数N.M和K,K为坏点数.接下来K行,每行一个坏点坐标(n,m),1<=n<=N,1&l…
Bugs Integrated, Inc. 给出一个\(n\times m\)的矩形网格图,给出其中K个障碍物的位置,求其中最多能摆的\(2\times 3\)的矩形的个数,\(n\leq 150,m\leq 10\). 解 注意到m的数据范围很小,在这里进行进制压缩,而n进行对每一行的处理,设\(f[i][j]\)表示前i行第i行状态为j的方案数,注意到,\(2\times 3\)的矩形可以有3个长度,于是仅靠二进制是不够表现状态的,于是j是一个三进制数表示,其中2表示这个格子控制下面的2格,…
http://poj.org/problem?id=1038 发一下中文题面(今天考试直接被改了): 生记茶餐厅由于受杀人事件的影响,生意日渐冷清,不得不暂时歇业.四喜赋闲在家,整天抱着零食看电视,在大家的提醒下才开始注意自己日益发福的形象,下定决心减肥,萌发了去工作压力大的电脑公司打工的念头.于是,她应聘到了 Bugs 公司,这是一家专门生产硬件的企业.初来乍到,四喜被分配到车间进行产品组装,工作就是把公司生产的一种 2*3 单位尺寸的芯片嵌入 N*M 单位尺寸的模板内.模板接受过严格检查,损…
AC通道 神坑的一道题,写了三遍. 两点半开始写的, 第一遍是直接维护两行的二进制.理论上是没问题的,看POJ discuss 上也有人实现了,但是我敲完后准备开始调了.然后就莫名其妙的以为会超时,就删掉了. 第二遍是想错了,因为和之前写过的一道题很像,那道题的正方形最中间不重合即可,所以我以为本质是一样的,然后按照那样的思路写.写写调调到五点半,样例搞掉后,提交,A2T7W1 然后随便找了组数组跟了一下,发现这个方块不允许重合导致这两道题的核心思路差别很大,所以删掉了. 第三遍开始按照自己想的…
题目大意 要求你在N*M大小的主板上嵌入2*3大小的芯片,不能够在损坏的格子放置,问最多能够嵌入多少块芯片? 题解 妈蛋,这道题折腾了好久,黑书上的讲解看了好几遍才稍微有点眉目(智商捉急),接着看了网上大牛的解题报告和实现代码才弄明白怎么用三进制来进行状态压缩,关键就是理解能够横着放置和竖着放置的条件.由于竖着放置会受到前面两行的影响,这样我们就可以用三进制来表示前面两行的状态了,然后根据前面两行的状态我们也可以得到当前行与前一行的初始状态,之后再根据两个的状态进行放置砖块~~~~具体怎么样的看…
(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-…
题意:N*M的矩阵,矩阵中有一些坏格子,要在好格子里铺2*3或3*2的地砖,问最多能铺多少个. 我的方法好像和网上流传的方法不太一样...不管了.... 由数据范围很容易想到状压dp 我们设某个状态的某一位表示这个格是某种地砖的左上角 那么就会有三种状态,理论上应该用三进制来存储,但我哪会三进制用位运算很方便于是就用2位二进制数来代替1位三进制数... 用00代表没有地砖,01代表铺了个2*3的地砖,10代表铺了个3*2的地砖 然后为了节约空间和时间,先对一个空行dfs一遍,得到这一行可能的地砖…
本题的题眼很明显,N (1 <= N <= 150), M (1 <= M <= 10),摆明了是想让你用状态压缩dp. 整个思路如下:由于要填2*3或者3*2的芯片,那么就要找一个策略来判断到底能不能填. 精华1在此: 找到的策略是,记格子(i,j)的状态有三种: 状态0代表(i,j)和(i-1,j)均可用(可用包括非损坏和未占用) 状态1代表(i,j)可用但(i-1,j)不可用 状态2代表(i,j)和(i-1,j)均不可用. 这样设置状态后,我们可以将填芯片这个问题策略化描述:…
状态压缩一下当前各格子以及上面总共放了几块,只有012三种情况,直接三进制保存即可. 然后转移的时候用搜索找出所有的状态进行转移. #include <map> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (…