状压dp
Ren_Ivan
衡中oier,fight for furture
展开
-
spot 状压dp
题目大意:数轴上有n个泥点,共有m个木板,求最少用几个木板可以覆盖全部泥点,并求最优方案数(n,m看范围,肯定是状压f[i][j]表示前i个泥点都被覆盖,使用的木板集合为j转移:f[ii][j|bit[k]]+=f[i][j]*(r-l+1)ii表示枚举木板k能转移到的所有位置,r,l分别表示可行的左右端点#include#include#include#include原创 2017-07-11 18:38:06 · 342 阅读 · 0 评论 -
[HAOI2008]移动玩具 状压
发现自己只会打状压了。 233333不需要考虑是否会被挡,所以直接dp#include#include#include#include#includeusing namespace std;int tot1,tot2,a[5][5],b[5][5];int x1[20],x2[20],y11[20],y2[20];char ch;int dis[20][20],f[20]原创 2017-07-14 21:31:48 · 353 阅读 · 0 评论 -
bzoj 1076 奖励关 状压+期望dp
因为每次选择都是有后效性的,直接dp肯定不行,所以需要逆推。f[i][j]表示从第i次开始,初始状态为j的期望收益#include#include#includeusing namespace std;int bit[18],K,n,aa,ned[18],a[18];double f[105][1<<17];int main(){ bit[0]=1; for(int i=原创 2017-07-09 19:47:39 · 314 阅读 · 0 评论 -
bzoj 3195 奇怪的道路 状压dp
看范围,状压没毛病 但是如果随便连的话给开1<<16,乘上n,m就爆了 所以规定转移时只向回连边 于是想状态数组:f[i][j]表示到i这里i前K位的状态为j(表示奇偶) 发现有条数限制,但是n,m,2^K都比较小,加一维, f[i][j][k]表示前i位,用j条路,i前的K位状态为j 转移的话,因为1<=|u - v|<=K, 所以转移时必须要保证转移前一位能连到的最远距离是偶数原创 2017-07-28 18:02:43 · 423 阅读 · 0 评论 -
拯救莫莉斯 状压dp
题目大意:每个点有费用,要求选出花费最少的一些点,使得全部点都满足:他被选或与他相邻的任意点被选。没看清数据范围233333和翻格子游戏一样,考虑上中下三行,可行才能转移f[i][j][k]表示到第i行i-1行状态为j,i行状态为k,且i行以前的所有行均满足条件f[i][j][k]------>f[i+1][k][l] j|k|l|(k>1) 覆盖所有棋子#include#原创 2017-08-07 06:12:51 · 479 阅读 · 0 评论 -
[Usaco2007 Open]Fliptile 翻格子游戏 状压dp
n,m每一行的状态只与三行有关,所以从第一行开始枚举,每一次让下面一行填上他上面那行的坑最后一行必须要同时满足他自己和他上面那行,否则舍去#include#include#include#include#includeusing namespace std;int n,m,a[18][18],now[18][18],tim[18][18],nxt[18],final[18]原创 2017-08-07 06:20:22 · 446 阅读 · 0 评论 -
bzoj 4565 状压区间dp
我还以为我状压很好。。。。。。 噗!!! 果然我区间很差。。。 f[i][j][s]表示i~j段,合并后的状态为s所得的最大收益 枚举i,j,k,s. f[i][j][s<<1]=max(f[i][j][s<<1],f[i][k−1][s]+f[k][j][0]) f[i][j][s<<1|1]=max(f[i][j][s<<1|1],f[i][k−1][s]+f[k][j][1])原创 2017-08-15 17:32:51 · 416 阅读 · 0 评论