树形dp总结
2016-08-21 22:39
218 查看
这个月一直搞dp了,状压,数位,树形,感觉虽然有时训练很辛苦,但真的很充实。
这个星期看了一些树形dp的资料。
树形dp简单来说就是在树上的dp,这里的很多题,都和背包有联系,从一个根节点开始,分配方案给它的子树。
有一个很有意思的题。没有上司的聚会(HDU 1520)。
大致题意就是说,要举办一个聚会,每个人都有一个权值,然后所有人都不希望碰到自己的直系上司。显然没有成环的现象。
那么这些人的关系就可以组成一个树。典型的树形dp。
一个人无非2个状态,来或者不来。
那么我们就可以建一个dp[i][j],代表第i个来或者不来的最大权值。j=0不来,j=1来。
在用DFS搜索一遍就好了。
下面附上代码。
这个星期看了一些树形dp的资料。
树形dp简单来说就是在树上的dp,这里的很多题,都和背包有联系,从一个根节点开始,分配方案给它的子树。
有一个很有意思的题。没有上司的聚会(HDU 1520)。
大致题意就是说,要举办一个聚会,每个人都有一个权值,然后所有人都不希望碰到自己的直系上司。显然没有成环的现象。
那么这些人的关系就可以组成一个树。典型的树形dp。
一个人无非2个状态,来或者不来。
那么我们就可以建一个dp[i][j],代表第i个来或者不来的最大权值。j=0不来,j=1来。
在用DFS搜索一遍就好了。
下面附上代码。
#include<bits/stdc++.h> using namespace std; int val[6005],dp[6005][3]; int n; bool vis[6005]; vector<int> v[6005]; void dfs(int a) { vis[a]=1; dp[a][1]=val[a]; dp[a][0]=0; int i,j,k; for(i=0;i<v[a].size();i++) { int w=v[a][i]; if(vis[w]) continue; dfs(w); dp[a][0]+=max(dp[w][1],dp[w][0]); dp[a][1]+=dp[w][0]; } } int main() { int i,j,k; while(~scanf("%d",&n)) { memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); for(i=1;i<=n;i++) { scanf("%d",&val[i]); v[i].clear(); } int a,b; while(scanf("%d%d",&a,&b) && a+b) { v[a].push_back(b); v[b].push_back(a); } dfs(1); printf("%d\n",max(dp[1][0],dp[1][1])); } return 0; }
相关文章推荐
- 详解Android应用中屏幕尺寸的获取及dp和px值的转换
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- Android dpi,dip,dp的概念以及屏幕适配
- Android px、dp、sp之间相互转换
- HP data protector软件学习1--基本角色与基本工作流程
- HP data protector软件学习2--软件组成与界面介绍
- android中像素单位dp、px、pt、sp的比较
- Android对px和dip进行尺寸转换的方法
- 关于UI切图与开发 px和dp
- Android根据分辨率进行单位转换-(dp,sp转像素px)
- android 尺寸 dp,sp,px,dip,pt详解
- DP问题各种模型的状态转移方程
- POJ-1695-Magazine Delivery-dp
- nyoj-1216-整理图书-dp
- TYVJ1193 括号序列解题报告
- 对DP的一点感想
- TYVJ上一些DP的解题报告
- soj1005. Roll Playing Games