hiho 12 树的dp
来源:互联网 发布:python 小波变换 编辑:程序博客网 时间:2024/04/28 14:25
问题描述:
给定一棵由n个节点组成的树,并对每个节点标定一个权重值
分析:
对于一棵子树,根节点为t,可以这样枚举:首先必须包含根节点,然后对于每个儿子节点s,可以将其看做一棵子树,为每个s分配选择的节点数为
定义f(s, c) 表示对以s为根的子树,分配c个节点,能够得到的最大权重值。
那就是求max{
这里我们可以使用树的后序遍历,先求出子节点的f(s, c), 存储起来,就避免了多次求解。
在节点内部求解f(s, c) 时, 问题就变成已知n种物品,物品有多个,购买k个第i中物品得到的价值为w(i, k)。这个问题其实就是一个最基本的完全背包问题。但是由于购买物品个数与所得价值不是线性变化,因此不能使用完全背包的优化,必须是从后往前求解。
#include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;enum {maxn = 100+5};vector<int> tree[maxn];int dp[maxn][maxn];int n, m;int value[maxn];void dfs(int root, int pre){ for (int i=0; i< tree[root].size(); i++) { if ( tree[root][i]!= pre) dfs(tree[root][i], root); } dp[root][0] = 0; for (int i=1; i<=m; i++) dp[root][i] = value[root]; for(int i=0; i< tree[root].size(); i++) { if (tree[root][i] == pre) continue; for (int j=m; j>=2; j--) for (int k=1; k <= j-1; k++) dp[root][j] = max(dp[root][j], dp[root][j-k]+ dp[tree[root][i]][k]); }}#define OJint main(){ #ifndef OJ freopen("in.txt", "r", stdin); #endif // OJ scanf("%d %d", &n, &m); for (int i=1; i<=n; i++) { scanf("%d", value+i); } for (int i=1; i< n; i++) { int a, b; scanf("%d %d", &a, &b); tree[a].push_back(b); tree[b].push_back(a); } dfs(1, 0); printf("%d\n", dp[1][m]); return 0;}
0 0
- hiho 12 树的dp
- hiho 1270(dp)
- 【DP】HIHO 1078
- hiho 数位dp
- HiHo 1037 数字三角形 (dp)
- Hiho 1044 dp+状态压缩
- hiho 8 状态压缩dp
- Hiho 1044 状态压缩dp
- hiho 10 二叉树的遍历
- hiho 11 树的最长路径
- HIHO #1078 : 线段树的区间修改
- hiho 挑战赛7(有钱就是任性-dp与质数的因子)
- 【hiho挑战赛24 A&B&C】贪心和期望dp惨烈的后缀自动机
- hiho #1532 : 最美和弦(记忆化搜索思路的DP写法)
- hiho一下 第109周 Tower Defense Game 树DP+贪心
- hiho 1290 —— Demo Day 【DP】
- HIHO #1055 : 刷油漆(树形dp 入门)
- hiho一下 第113周 Fibonacci (dp)
- cl(ml )不是内部或外部命令
- 多线程 下载网络图片主线程实现
- LRU java算法实现
- 云计算笔记
- 图片处理工具类
- hiho 12 树的dp
- 单列的演练
- 区间调度问题
- 遗传算法入门(二)
- 多线程 NSTread
- 第十二周项目二 (3)计算图G中出度为0的顶点数
- zzoffer调整数组顺序使奇数位于偶数前面
- 多线程 GCD
- 前端入门方法总结