洛谷P2465


SOL

比较经典的一类树上背包问题套一个子集状压枚举。

注意到代价的计算与所选的点的集合有关,如果我们要统计代价需要状压记录点集,而数据范围非常配合的给了P≤12P\le12P≤12,直接状压当前子树包含的点集。

从叶子向根dp,对于TTT个限制,预处理出每一个点集SSS所产生的收益,并把路径拆成一个一个点,在向根转移的时候分开算贡献,及将子树的贡献算出,只考虑当前这个点对应的点集所产生的贡献。

{f[u][S]=max(f[v][S′]+f[u][(S−S′)])f[u][S]+=val[S]\begin{cases} f[u][S]=max(f[v][S']+f[u][(S-S')])\\ f[u][S]+=val[S]\\ \end{cases} {f[u][S]=max(f[v][S′]+f[u][(S−S′)])f[u][S]+=val[S]​

背包的本质还是不变的。注意一下细节,即当前点的贡献要最后加入,以及集合从大到小枚举(压缩掉了滚动数组)


CODE

#include<bits/stdc++.h>
using namespace std;
#define sf scanf
#define ri register int
#define in red()
#define gc nc()
#define cs const
#define ll long long
inline char nc(){static char buf[100000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++;
}
inline int red(){int num=0,f=1;char c=gc;for(;!isdigit(c);c=gc)if(c=='-')f=-1;for(;isdigit(c);c=gc)num=(num<<1)+(num<<3)+(c^48);return num*f;
}
cs int N=110,lim=1<<12;
inline int lb(int x){return x&(-x);}
int f[N][lim],val[lim],n,m,up;
vector<int> g[N];
#define It vector<int>::iterator
inline void ckmax(int &a,int b){if(a<b)a=b;}
void dfs(int u,int fa){for(It t=g[u].begin();t!=g[u].end();++t){int v=*t;if(v==fa)continue;dfs(v,u);for(ri i=up;i>=0;--i){for(ri j=i;j;j=(j-1)&i){ckmax(f[u][i],f[v][j]+f[u][i^j]);}}}for(ri i=0;i<=up;++i)f[u][i]+=val[i];
}
signed main(){freopen("data.in","r",stdin);n=in;m=in;up=(1<<m)-1;for(ri i=1;i<n;++i){int u=in,v=in;g[u].push_back(v);g[v].push_back(u);}for(ri i=1;i<=n;++i){for(ri j=0;j<m;++j){f[i][1<<j]=-1*(in);}for(ri j=1;j<=up;++j){f[i][j]=f[i][lb(j)]+f[i][j^lb(j)];}}int T=in;while(T--){int vl=in,k=in,tmp=0;while(k--){int id=in;tmp|=(1<<(id-1));}for(ri i=1;i<=up;++i){if((i&tmp)==tmp){val[i]+=vl;}}}dfs(1,0);cout<<f[1][up];return 0;
}

[SDOI2008]山贼集团【树上背包+状压】相关推荐

  1. 【[SDOI2008]山贼集团】

    非常好的一道题 树上的状压\(dp\) 根据数据范围我们就能知道这是一道需要状压的题目 所以状态就是\(dp[i][S]\)表示在以\(i\)为根的子树里,选择的状态为\(S\)的最大收益 这个收益只 ...

  2. P2465 [SDOI2008]山贼集团 dp

    这个题是一道树形dp+状压dp二合一,先预处理每种组合会有什么额外的费用,然后在树上dp就行了. 题干: 题目描述某山贼集团在绿荫村拥有强大的势力,整个绿荫村由N个连通的小村落组成,并且保证对于每两个 ...

  3. 【学术篇】SDOI2008 山贼集团

    今天一月一号.. 突然想安利一波我的中二的2017总结- 传送门1:codevs 传送门2:luogu 时限5s和1s的区别(你没看我传送门都给的大牛分站了) 现在不仅线筛.. 有负数的快读都打不对了 ...

  4. 【Luogu】P2465山贼集团(树形状压DP)

    题目链接 写了个70分暴力还挂了,第一遍提交只拿了十分--海星 首先建虚拟节点多叉树转成二叉,然后子集枚举DP 设g[x][i]是以x为根的子树内山贼集合i,x啥都不选也没贡献的时候的最大价值 f[x ...

  5. 洛咕 P2465 [SDOI2008]山贼集团

    裸的状压dp. 设f[i][j]表示在i字数内放j集合的分部,直接sb转移. // luogu-judger-enable-o2 #include<bits/stdc++.h> #defi ...

  6. jzoj3362,bzoj3758-[NOI2013模拟]数数【分段打表,背包,状压】

    正题 bzojbzojbzoj题面链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3758 题目大意 求A∼BA\sim BA∼B中有多少个数满 ...

  7. hdu 6149 Valley Numer II(01背包套状压dp)

    题目链接:hdu 6149 Valley Numer II 题意: 给你N个点,有k个为高点,其他为低点,现在这N个点有m条边,问你最多能组成多少个两个高点一个低点,低点和两个高点都有边相连这样的状态 ...

  8. [选拔赛2 NOIP2018雅礼集训 Day3 u,v,w]玩个三角形(二维差分),玩个球(状压DP+map),玩个树(树上DP)

    文章目录 T1:玩个三角形 title solution code T2:玩个球 title solution code T3:玩个树 title solution code T1:玩个三角形 tit ...

  9. 【SDOI2008】山贼集团

    本题的模型是树形状态压缩的动态规划. 首先考虑简单的题目模型:对于任何形态的有根树 T,都可以建立其等效二叉树 T',若在原树 T 中,结点 x 有儿子c1,c2,c3,-,ck c1,c2,c3,- ...

最新文章

  1. python3 multiprocessing 多进程 列表类型 listproxy 清除内容
  2. boost::hana::partial用法的测试程序
  3. Activiti之H2
  4. transformer中patch与token?
  5. 非常时期,手机不能没电不能离身啊
  6. DJango周总结二:模型层,单表,多表操作,连表操作,数据库操作,事务
  7. 阿里第三财季:下沉市场再立功 疫情之下祸福相依
  8. 5. DICOM图像层级分类-DCMTK-压缩图像PixelData读取
  9. 2022软考中级软件设计师---易混淆知识点总结1
  10. macd ema java源码_[转载]彩色MACD指标源码
  11. 小胡学python【1】
  12. 猿创征文 |【gin-vue-admin】后端结构设计和基本工作原理
  13. PS一键制作针织毛衣纹理图案效果
  14. 《醒来的森林》带你走进神奇的鸟类世界
  15. r语言 转录本结构及丰度_桑基图的绘制核心微生物组分类学及丰度展示
  16. 网站页面SEO优化方案
  17. 邮票问题---动态规划
  18. 开发的阅读文档来源灵感
  19. 【观察】解读神州鲲泰:二十年磨一剑,积硅步至千里
  20. Windows下redis修改端口号无效

热门文章

  1. jenkins定时备份插件 ThinBackup
  2. 本周票房大盘 API数据接口
  3. 原始数据都一样,为啥Pyecharts做出来的图一个是彩色的,另一个是黑白的?
  4. 966. Vowel Spellchecker
  5. 不同的音频格式如何相互转换?
  6. 【报告分享】2021小红书食饮品牌研究报告-艺恩(附下载)
  7. 2022湖南最新消防设施操作员模拟试题题库及答案
  8. QCAD与libreCAD的试用及比较,QCAD比libreCAD更好用,功能更强大
  9. Neutron 理解 (6): 如何实现虚拟三层网络
  10. 【程序猿保健】ShaderJoy —— 拉力带教程