题目链接 Emma and Eric are moving to their new house they bought after returning from their honeymoon. Fortunately, they have a few friends helping them relocate. To move the furniture, they only have two compact cars, which complicates everything a bit.…
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表行数,j代表当前行棋子的状态.j的二进制中,1代表有旗子,0代表无棋子. 贴代码~状压DP果然快一点. #include <cstdio> #include <cstring> int n,k,count; ][]; ]; ][]; int main() { // freopen(&q…
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻击范围如图中黑色区域所示: 如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色…
dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组) 标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推下一层 由于最多只有60多种状态 所以这其实就是个大暴力 其实还不慢 关于为什么要反义输入地图 因为我懒得写一个地图匹配状态函数了 所以直接让地图反义匹配状态 应该算是比较简单的状压DP 然而我还是写残了WA了两次orz #include <iostream> #include <strin…
/* 状压dp 邮递员问题:求经过任意点出发经过每一条边一次并回到原点. 解法:1.如果是欧拉回路那么就是所有的边的总和. 2.一般的解法,找出所有的奇度顶点,任意两个顶点匹配,即最小完美匹配,可用状压dp. */ #include<stdio.h> #include<string.h> #define N 20 #define inf 1000000000 int ma[N][N]; int lower[N]; int dp[1<<16];//注意这里数组要开够 vo…
题意:有n个(n<=10)物品,两辆车,装载量为c1和c2,每次两辆车可以运一些物品,一起走.但每辆车物品的总重量不能超过该车的容量.问最少要几次运完. 思路:由于n较小,可以用状态压缩来求解.   家具从左到右依次对应二进制形式的低位到高位,该位上为1表示该家具还没运走,0表示已经运走.   建立两个数组,s1[],s2[],分别存储一次性能被货车1和货车2运走的状态.   之后再把s1,s2数组中的状态合并一下,存入到s数组中去,即表示能一次性被两辆货车同时运走的状态.         合并…
题意:有人要搬家,有两辆车可以运送,有若干家具,车有容量限制,而家具也有体积,那么如何运送会使得运送车次最少?规定两车必须一起走,两车一次来回只算1躺. 思路:家具怎么挑的问题,每趟车有两种可能:1带走此家具:2此趟暂时不带走.那就是01背包了.但是限制是两只车的容量.求的是趟数. 1)数据量较小,将这10件以内的所有物品的可能组合记录一下,有2^10种,其中是包含了一些运不走的组合,滤掉,只留下可能的组合.对每种可能的新组合进行01背包,即考虑对于新组合i这种运送方案该不该取,如果取了能使车次…
题目链接:http://poj.org/problem?id=2923 题目的大概意思是,有两辆车a和b,a车的最大承重为A,b车的最大承重为B.有n个家具需要从一个地方搬运到另一个地方,两辆车同时开,问最少需要搬运几次? 我先想的是我由A车开始搬,搬运能装的最大的家具总重,然后状态压缩记录下搬运了哪些,然后再由B车搬运,状态压缩记录搬运了哪些.以此类推,直到状态满了. 以上方法TLE 然后,实在想不出来了,看了题解:http://blog.csdn.net/woshi250hua/articl…
题目传送门 这道题暑假做的时候太模糊了,以前的那篇题解大家就别看了==.今天再复习状压感觉自己当时在写些什么鸭.... 题目大意:给你一个\(n\)*\(m\)的棋盘和许多\(1*2\)的骨牌,骨牌可以竖放或横放,问有多少种方案将骨牌铺满. 设计状态,\(f[i][j]\)表示当前在第\(i\)行,之前的所有行都已经铺满,当前行的状态为\(j\)的方案数.如果我们对01串的定义仍确定为1为放了0为没放,那么真的对嘛? 好像不行,存出不了那么多信息.我们试着改变0和1的含义.因为骨牌要么是横放要么…
题目 传送门:QWQ 分析 看到$ M<=10 $考虑状压. 然后把每行都压一下,那么每个状态相关的就是上一行和上上行的状态. 然后枚举. 然后复杂度最坏是$ O(100 \times 1024^3) $的 仔细分析一下,有很多状态是无用的,但还是被判断了,比如$ 11111 $,显然不能做到不误伤. 那么我们把所有可能的状态拉出来(据说小于70?),即代码中的$ st $数组 然后用$ dp[i][j][k] $ 表示前i行上行状态st[j]本行状态st[k]的最大炮兵数量 然后就可以通过上行…