
状压dp
林伏案
妖蛾子良多的范老爷
展开
-
poj1185
/*solution: 状压dp d[i][j][k]表示第i行的炮兵拜访情况为i,地i-1行炮兵拜访情况为k的前i行所能放的炮兵的最大解 初始化d[0][j][0] = soldier_num[j]; d[1][i][j] = max(d[1][i][j], d[0][j][0] + soldier_num[i])note: 注意d[i][j][k]中的j表示编号原创 2016-08-16 15:16:13 · 417 阅读 · 0 评论 -
hdu1074(状压)
/*translation: 给出n门作业,没门作业有期限和完成所需的时间。超过期限每一天就扣掉一分。求最少扣掉多少分。并按字典序给出 作业的完成顺序。solution: 状压dp 仔细观察题意可以发现就是求作业的某一种排列顺序使得满足最优解。所以用动态规划的状态表示一定涉及到集合。 又考虑到数据量不多。所以可以用状态压缩。note: 1:注意枚举作业状态时候的顺序,见代码注释。原创 2016-10-30 17:10:32 · 278 阅读 · 0 评论 -
poj2686(TSP)
/*translation: 一张图由n个点构成,并且若干个点之间由双向边连成。有若干票,每次走完一个边花费一张票 花费时间是边的长度 / 票的权重。求从指定起点到终点所用的最短时间。solution: 状压dp 首先观察数据,发现n比较小,很容易看出对n进行状态压缩。设置dp[s][v]表示状态s下,到达节点v所用的最短时间。 其中s表示已经使用的车票原创 2016-12-23 22:34:39 · 488 阅读 · 0 评论 -
poj2441(状压dp)
/*translation: 要给n头牛分配m个牛舍,每头牛有自己喜爱的若干牛舍。问总共有多少种分配方法?solution: 状态压缩dp即可。dp[s]表示到状态s的方案数目note: * 注意用__builtin_popcount(s)函数来判断1的个数是否满足转移的条件。date: 2016.12.31-----跨年题。希望17年赛季能够拿个牌子!!*/#include原创 2016-12-31 21:52:04 · 359 阅读 · 0 评论 -
poj3254(常见的二维状压dp)
/*translation: 给出一个n行m列的草地,1表示肥沃,0表示贫瘠,现在要把一些牛放在肥沃的草地上,但是要求所有牛不能相邻,问你有多少种放法solution: 状态压缩dp 每次枚举时候判断是否符合当前草地的情况,再判断是否跟前面的一行兼容。note: * 将所有合法状态预先处理存进一个数组里面即可提高速度 # 一开始check(i, s)WA了好多次,后来发现应该是ch原创 2017-01-01 01:19:02 · 322 阅读 · 0 评论 -
poj2836(状压dp)
/*translation: 二维平面上有n个点,现在求用长宽任意的矩形完全覆盖这些点所用的最小矩形面积总共是多少?solution: 状压dp dp[s]:=当前状态下最小面积 dp[当前状态] = min(dp[过去状态] + 矩形面积, dp[当前状态])note: # 这里注意,先对所有矩形进行预处理的时候,当要枚举的矩形的两个顶点在同一行或者同一列的点时,由于不允许面积为原创 2017-01-19 13:11:47 · 401 阅读 · 0 评论 -
poj3411(状态压缩dp,dijkstra最短路)
/*translation: 给出一张图,求节点0到节点n-1花费的最小费用。对于一条边a->b,可以有一下两种不同的付费方式: 1.在点c提前预付,但此时必须经过点c,花费为r 2.在点b支付,花费为psolution: 状态压缩dp+dijkstra dp[i][s]:=走到i点时的最优解,且此时走过的点状态为s(包括i) 然后根据dijkstra不断松弛即可。note:原创 2017-01-20 10:58:52 · 328 阅读 · 0 评论 -
poj1795(状态压缩dp,字符串压缩求最小字典序)
/*translation: 给出n个字符串,求一个最小长度的串,该串包含给出的所有字符串。注意该字符串在长度最小的同时还必须是字典序最小。solution: 状态压缩dp 注意到n的值比较小,所以考虑可以状态压缩。定义dp[i][s]:=在所有字符串选取情况为s的情况下,最前面的字符串为i号字符串 的最小长度。依次枚举下一个字符串可得状态转移方程 dp[i][原创 2017-01-27 12:12:32 · 1276 阅读 · 1 评论 -
poj3420(状态压缩+矩阵加速)
/*translation: 有4*n的矩形一个,求用1*2的砖块去铺可以有几种填充方法?solution: 矩阵加速+状态压缩 一看这道题以为是轮廓dp,但是由于n的值太大,所以无法进行轮廓dp,所以考虑用矩阵来加速。 如图片所示,在第n行铺完后第n+1行的情况可以有如图所示的几种情况。注意其中0101的状态是不可能出现的。因为如果出现0101 那么最原创 2017-01-26 21:03:07 · 382 阅读 · 0 评论