非常好的一道题

树上的状压\(dp\)

根据数据范围我们就能知道这是一道需要状压的题目

所以状态就是\(dp[i][S]\)表示在以\(i\)为根的子树里,选择的状态为\(S\)的最大收益

这个收益只是在子树内部的收益,我们往上转移的时候继续加

显然这个东西类似于一个树上背包,我们子树和根顺次合并就好了

由于这里的体积是状态,所以我们可以直接枚举子集进行转移

方程

\[dp[i][s]=max(dp[j][t]+dp[i][s\ xor\ t])\]

代码

#include<cstring>
#include<cstdio>
#include<iostream>
#define re register
#define min(a,b) ((a)<(b)?(a):(b))
#define max(a,b) ((a)>(b)?(a):(b))
#define lowbit(x) ((x)&(-x))
struct E
{int v,nxt;
}e[201];
inline int read()
{char c=getchar();int x=0,r=1;while(c<'0'||c>'9') {if(c=='-') r=-1;c=getchar();}while(c>='0'&&c<='9')x=(x<<3)+(x<<1)+c-48,c=getchar();return x*r;
}
int deep[101],head[101];
int map[101][13];
int num,M,n,m,ans=-999999999;
inline void add_edge(int x,int y)
{e[++num].v=y;e[num].nxt=head[x];head[x]=num;
}
int dp[101][4099],val[4099];
inline int tot(int x)
{int num=0;while(x) num++,x>>=1;return num;
}
void pre(int x,int fa)
{deep[x]=deep[fa]+1;for(re int i=head[x];i;i=e[i].nxt)if(!deep[e[i].v]) pre(e[i].v,x);
}
void dfs(int x)
{for(re int i=head[x];i;i=e[i].nxt)if(deep[e[i].v]>deep[x]){dfs(e[i].v);for(re int s=M;s;s--)for(re int t=s;t;t=t=(t-1)&s)dp[x][s]=max(dp[x][s],dp[x][s^t]+dp[e[i].v][t]);}for(re int s=0;s<=M;s++)dp[x][s]+=val[s];
}
int main()
{n=read(),m=read();int x,y;for(re int i=1;i<n;i++)x=read(),y=read(),add_edge(x,y),add_edge(y,x);M=(1<<m)-1;for(re int i=1;i<=n;i++){for(re int j=1;j<=m;j++)map[i][j]=read();for(re int j=1;j<=M;j++)dp[i][j]=dp[i][j^lowbit(j)]-map[i][tot(lowbit(j))];}int T=read();int V,C;while(T--){int s=0,x=0;V=read(),C=read();for(re int i=1;i<=C;i++)x=read(),s|=(1<<(x-1));int p=s^M;for(re int t=p;t;t=(t-1)&p)val[(t|s)]+=V;val[s]+=V;}pre(1,0);dfs(1);std::cout<<dp[1][M];return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10206148.html

【[SDOI2008]山贼集团】相关推荐

  1. P2465 [SDOI2008]山贼集团 dp

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

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

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

  3. [SDOI2008]山贼集团【树上背包+状压】

    洛谷P2465 SOL 比较经典的一类树上背包问题套一个子集状压枚举. 注意到代价的计算与所选的点的集合有关,如果我们要统计代价需要状压记录点集,而数据范围非常配合的给了P≤12P\le12P≤12, ...

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

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

  5. 【SDOI2008】山贼集团

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

  6. [FROM WOJ]#2040 山贼集团

    #2040 山贼集团 SDOI2008 题面 某山贼集团在绿荫村拥有强大的势力,整个绿荫村由N个连通的小村落组成,并且保证对于每两个小村落有且仅有一条简单路径相连.小村落用阿拉伯数字编号为1,2,3, ...

  7. 山贼集团 (group)

    山贼集团 (group) 题目描述 某山贼集团在绿荫村拥有强大的势力,整个绿荫村由N个连通的小村落组成,并且保证对于每两个小村落有且仅有一条简单路径相连.小村落用阿拉伯数字编号为1,2,3,4,-,n ...

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

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

  9. 「SDOI 2008」山贼集团

    传送门 problem 给定一棵 nnn 个点且根为 111 的树,有 ppp 个部门,每个部门会占据一个点,占据点会有代价,不同部门可以占据同一个点,每个部门的管辖范围是 111 到他占据点的链上的 ...

最新文章

  1. 计算机平均数的函数,Excel2010
  2. mac os 快捷键
  3. django model中的meta类
  4. spring动态代理实现计算器
  5. 解决方法WindowsError: [Error 193] %1 is not a valid Win32 application
  6. SAP业务测评之库存预留
  7. 使用jenkins进行git多分支项目打包时的一个小问题
  8. 计算机知识应用,计算机知识应用基础复习大纲
  9. 50多种在Photoshop中删除图像背景的工具和技术,第3页
  10. IEEE 回应禁止华为系审稿人;Wi-Fi 联盟等恢复华为成员资格;Angular 8 正式发布 | 极客头条...
  11. 神武显示未能成功连接服务器,神武:疑难问题解答,总有你要的答案
  12. ubuntu文件编码转换
  13. Remoting在FX2.0中的新特性 (2)
  14. Spark调优—参数调优
  15. vue 处理跨域问题及解决方法小结
  16. 《软考系统架构师》(二、信息系统基础知识)
  17. 二维离散沃尔什变换及matlab实现
  18. VideoPlayer视频播放
  19. asp.net core mvc 错误处理 ExceptionFilterAttribute
  20. 安卓期末大作业——校园二手街APP设计和实现

热门文章

  1. 阿里云亚太市场份额第一;AWS宣布在香港推出新区域;Facebook出成绩单;微软在美国西部开建第五个大型云平台...
  2. 记一次阿里云ECS服务器centos6.5无法使用epel源的爬坑
  3. Linux命令之重启命令
  4. 修改文件与文件提交--乐字节Java
  5. 一看就懂的i++和++i详解
  6. 动态建树之——查字典
  7. yqsc是什么意思_qsc的含义,qsc是什么的缩写,qsc的词语,qsc代表的意思
  8. 企服三会·PPT | 企业微信陆昊:让每个企业都有自己的微信
  9. 使用select2实现多功能下拉框,select2中文api
  10. 参考 | Windows安装cython-bbox