poj 1038 Bugs Integrated, Inc. 题解】的更多相关文章

提供一种代码难度比较简单的做法(可能) 状态表示: 设置状态$ f[i][j] $,表示第 \(i\) 行状态为 \(j\) 的最大放置数,因为这是个阴间题,因为题目内存设置很小,所以要用滚动数组,存储两行的状态就够了. 状态用三进制表示: 0 表示当前行和上一行均可用 1 表示当前行可用,上一行不可用 2 表示当前行和上一行都不可用 为了方便不过常数确实略大,我们用两个数组 \(pre\) , \(now\) 分别存放上一行和当前行的状态 那么就有: inline int getstate(i…
题意:n*m方格,有些格子有黑点,问你最多裁处几张2 * 3(3 * 2)的无黑点格子. 思路:我们放置2 * 3格子时可以把状态压缩到三进制: 关于状压:POJ-1038 Bugs Integrated, Inc. (状压+滚动数组+深搜 的动态规划),写的很详细 所以我们直接枚举每一行的所有可能状态,并算出每种状态最大值.这样我们到最后只要找到n行所有状态最大值就行了. 代码: #include<cmath> #include<stack> #include<queue&…
AC通道 神坑的一道题,写了三遍. 两点半开始写的, 第一遍是直接维护两行的二进制.理论上是没问题的,看POJ discuss 上也有人实现了,但是我敲完后准备开始调了.然后就莫名其妙的以为会超时,就删掉了. 第二遍是想错了,因为和之前写过的一道题很像,那道题的正方形最中间不重合即可,所以我以为本质是一样的,然后按照那样的思路写.写写调调到五点半,样例搞掉后,提交,A2T7W1 然后随便找了组数组跟了一下,发现这个方块不允许重合导致这两道题的核心思路差别很大,所以删掉了. 第三遍开始按照自己想的…
状态压缩一下当前各格子以及上面总共放了几块,只有012三种情况,直接三进制保存即可. 然后转移的时候用搜索找出所有的状态进行转移. #include <map> #include <queue> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define F(i,j,k) for (…
$ POJ~1038~~\times Bugs~Integrated~Inc: $ (复杂的状压DP) $ solution: $ 很纠结的一道题目,写了大半天,就想练练手,结果这手生的.其实根据之前那道炮兵阵地就不应该写的,但是总觉得自己的思路会好一些,码量又小. 博主的核心思路其实就是用一个二进制数来压缩三行的状态,因为二进制的左移右移很方便.然后就是如果三进制会很不好转移. 我们可以用一个二进制数来预处理压缩出第 $ i $ 往下三行的障碍状态,前 $ m $ 个二进制位表第 $ i $…
Description Bugs Integrated, Inc. is a major manufacturer of advanced memory chips. They are launching production of a new six terabyte Q-RAM chip. Each chip consists of six unit squares arranged in a form of a 2*3 rectangle. The way Q-RAM chips are…
又是一道神仙题,又是题解看不懂-- 好时代,来临力-- 时隔一个世纪来补题解了-- 之前太垃圾了,脑子有点问题,所以没看懂题解.今天再看这道题虽然还是很毒瘤,但也没有想象得那么难. 先观察芯片的形状,肯定要三进制状压.所以表示一下状态:对于每一个格子 \((i,j)\),\(0\) 表示 \(i-1,i-2\) 行都可以放:\(1\) 表示 \(i-1\) 行可以放,\(i-2\) 行不行:\(2\) 表示 \(i-1\) 行不能放(\(i-2\) 行就不用管了). 于是就可以由上一行的状态推出…
题目来源: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…
题目链接 poj 2096Collecting Bugs 题解 dp[i][j]表示已经找到i种bug,并存在于j个子系统中,要达到目标状态的天数的期望. 显然,dp[n][s]=0,因为已经达到目标了.而dp[0][0]就是我们要求的答案. dp[i][j]状态可以转化成以下四种: dp[i][j] 发现一个bug属于已经找到的i种bug和j个子系统中-->p1 = ij / (ns) dp[i+1][j] 发现一个bug属于新的一种bug,但属于已经找到的j种子系统-->p2 = (n-i…
地址 http://poj.org/problem?id=2431 题解 朴素想法就是dfs 经过该点的时候决定是否加油 中间加了一点剪枝 如果加油次数已经比已知最少的加油次数要大或者等于了 那么就剪枝 然而 还是TLE了 TLE代码 #include <iostream> #include <vector> #include <algorithm> #include <queue> using namespace std; vector<pair&l…
地址 http://poj.org/problem?id=1064 题解 二分即可 其实 对于输入与精度计算不是很在行 老是被卡精度 后来学习了一个函数 floor 向负无穷取整 才能ac 代码如下 #include <iostream> #include <vector> #include <math.h> #include <algorithm> using namespace std; vector<double> v; int n, k;…
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 单位尺寸的模板内.模板接受过严格检查,损…
[问题描述] 假定海岸线是一条无限延伸的直线,陆地在海岸线的一边,大海在另一侧.海中有许多岛屿,每一个小岛我们可以认为是一个点.现在要在海岸线上安装雷达,雷达的覆盖范围是d,也就是说大海中一个小岛能被安装的雷达覆盖,那么它们之间的距离最大为d. 我们使用平面直角坐标系,定义海岸线是x轴,大海在x轴上方,陆地在下方.给你海中每一个岛屿的坐标位置(x,y)和要安装的雷达所覆盖的范围d,你的任务是写一个程序计算出至少安装多少个雷达能将所有的岛屿覆盖. (POJ输入中将有多组数据,每组数据间有一行空着,…
题目大意 要求你在N*M大小的主板上嵌入2*3大小的芯片,不能够在损坏的格子放置,问最多能够嵌入多少块芯片? 题解 妈蛋,这道题折腾了好久,黑书上的讲解看了好几遍才稍微有点眉目(智商捉急),接着看了网上大牛的解题报告和实现代码才弄明白怎么用三进制来进行状态压缩,关键就是理解能够横着放置和竖着放置的条件.由于竖着放置会受到前面两行的影响,这样我们就可以用三进制来表示前面两行的状态了,然后根据前面两行的状态我们也可以得到当前行与前一行的初始状态,之后再根据两个的状态进行放置砖块~~~~具体怎么样的看…
题意:N*M的矩阵,矩阵中有一些坏格子,要在好格子里铺2*3或3*2的地砖,问最多能铺多少个. 我的方法好像和网上流传的方法不太一样...不管了.... 由数据范围很容易想到状压dp 我们设某个状态的某一位表示这个格是某种地砖的左上角 那么就会有三种状态,理论上应该用三进制来存储,但我哪会三进制用位运算很方便于是就用2位二进制数来代替1位三进制数... 用00代表没有地砖,01代表铺了个2*3的地砖,10代表铺了个3*2的地砖 然后为了节约空间和时间,先对一个空行dfs一遍,得到这一行可能的地砖…
Euclid's Game Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9023   Accepted: 3691 Description Two players, Stan and Ollie, play, starting with two natural numbers. Stan, the first player, subtracts any positive multiple of the lesser o…
寻找路径,动态规划法题解. 本题和Leetcode的triangle题目几乎相同一样的,本题要求的是找到最大路径和. 逆向思维.从底往上查找起就能够了. 由于从上往下能够扩展到非常多路径.而从下往上个点的路径是由两条缩减到一条. 这样就能够非常easy记录最大路径了. #include <stdio.h> const short MAX_ROW = 101; short triangle[MAX_ROW][MAX_ROW]; short table[MAX_ROW]; short row; i…
Description: 给你一个n * m的方格纸,有一些格子无法被覆盖,然后用2*3的格子覆盖这个方格纸,问你最多能放多少个格子 神级状压 为了弄清楚这道题翻了无数篇解题报告,最后终于搞明白了 用三进制表示每行的状态. 比如对于第i行第j列的格子,如果i-1行,i行的j列都是空的则用0表示,i行的j列不能放用2表示,剩下的(仅i - 1行的j列不能放)用1表示 然后深搜进行转移 干讲没意思,具体看注释,写的很清楚了(AC代码是poj的,稍微改一下输入输出就是洛谷的. #include<ios…
一条标准的拓扑题解. 我这里的做法就是: 保存单亲节点作为邻接表的邻接点,这样就非常方便能够查找到那些点是没有单亲的节点,那么就能够输出该节点了. 详细实现的方法有非常多种的,比方记录每一个节点的入度,输出一个节点之后,把这个节点对于其它节点的入度去掉,然后继续查找入度为零的点输出.这个是一般的做法了,效果和我的程序一样的. 有兴趣的也能够參考下我这样的做法. #include <stdio.h> #include <string.h> #include <vector>…
本题是贪心法题解.只是须要自己观察出规律.这就不easy了,非常easy出错. 一般网上做法是找区间的方法. 这里给出一个独特的方法: 1 依照x轴大小排序 2 从最左边的点循环.首先找到最小x轴的圆 3 以这个圆推断能够包含右边的多少个圆,直到不能够包含下一个点,那么继续第2步,画一个新圆. 看代码吧,应该非常清晰直观的了. 效率是O(n),尽管有嵌套循环.可是下标没有反复.一遍循环就能够了.故此是O(n). #include <stdio.h> #include <cmath>…
地址 http://poj.org/problem?id=1979 Description There is a rectangular room, covered with square tiles. Each tile is colored either red or black. A man is standing on a black tile. From a tile, he can move to one of four adjacent tiles. But he can't mo…
地址 http://poj.org/problem?id=2456 解法 使用二分逐个尝试间隔距离 能否满足要求 检验是否满足要求的函数 使用的思想是贪心 第一个点放一头牛 后面大于等于尝试的距离才放置一头牛 如果能放置完所有的牛 那么就继续增加尝试的距离 否则就减少尝试的距离 代码 #include <iostream> #include <vector> #include <math.h> #include <algorithm> using names…
目录 Meet in the Middle 总结 1.算法模型 1.1 Meet in the Middle算法的适用范围 1.2Meet in the Middle的基本思想 1.3Meet in the Middle的算法过程 1.4Meet in the Middle的时间复杂度分析 2.代码实现 例题 [SPOJ ABCDEF] 法1: 结果合并法 法2:哈希表 法3:map 3.扩展运用 [BZOJ 4800] 冰球世界锦标赛 [POJ 1186] 方程的解数 [BZOJ 2679]…
题意: 有n种bug和s种系统bug,每天发现一种bug(可能已经发现过了)所有种bug被发现的概率相同,求所有bug被发现的期望天数. 分析: dp[i][j]发现i种bug,j种系统bug期望天数,dp[n][s]=0;dp[0][0]即为所求 dp[i][j] = (n-i)*(s-j)/n/s*dp[i+1][j+1] + i*(s-j)/n/s*dp[i][j+1] + (n-i)*j/n/s*dp[i+1][j] +i*j/n/s*dp[i][j]+1; #include <map>…
多重背包.本题不须要二分优化.相对简单点.由于反复数十分小,小于10. 而添加一个限制每种材料的高度做法.假设使用逆向填表,那么仅仅须要从这个高度往小递归填表就能够了. 还有就是注意要排序,以限制高度为标准从小到大排序.否则答案错误的. #include <stdio.h> #include <string.h> #include <algorithm> using std::sort; const int MAX_K = 401; const int MAX_H =…
Trie的应用题目. 本题有两个难点了: 1 动态建立Trie会超时,须要静态建立数组,然后构造树 2 推断的时候注意两种情况: 1) Tire树有133,然后插入13333556的时候.2)插入顺序倒转过来的时候 改动一下标准Trie数的插入函数就能够了: #include <stdio.h> #include <string.h> const int MAX_NODE = 100001; const int MAX_WORD = 11; const int ARR_SIZE =…
典型的给出区间任务和效益值,然后求最大效益值的任务取法. 属于一维DP了. 一维table记录的数据含义:到当前任务的截止时间前的最大效益值是多少. 注意. 这表示当前任务一定要选择,可是终于结果是不一定选择最后一个任务.故此最后须要遍历找到table数组的最大值,当然计算过程中使用一个数记录终于最大值也是能够的. 状态转移方程就是: tbl[i] = MAX({from tbl[0]->tbl[i-1] }+ weight[i] ),即区间0到i-1加上i的当前效益值. #include <…
(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 (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)均不可用. 这样设置状态后,我们可以将填芯片这个问题策略化描述:…