E. Paint the Tree

题目大意:给你一棵树,每一个点都可以染k种颜色,你拥有无数种颜色,每一种颜色最多使用2次,如果一条边的两个节点拥有同一种颜色,那么就说

这条边是饱和的,一个树的价值定义为饱和边的权值之和,问一棵树的最大价值是多少。

dp[u][1] 表示这条边用了k种颜色了。

dp[u][0] 表示这条边用了k-1种颜色。

子节点往父亲节点转移的时候,这个转移带有一点点的贪心。

首先因为每一个子节点到父亲节点的这条边要不要都会对后面产生影响。

所以我们可以构造一个模型,dp模型

如果有n个物品,每一个物品有两种选择,A和B,有一个限制就是如果选A,那么选A的数量不能超过k个,然后问选完之后的最大价值,A的价值为a, B的价值为b。

这个就可以用dp来考虑,dp[i][j] 表示前面 i 个选了j个A的最大价值。

当然也可以不dp,可以贪心的考虑,因为所有的B都是可以选择的,所以我们先考虑,选择所有的B,然后考虑,如果要换成A可以增加的差值。

sort排序找前面k大且大于0的差值。

这个题目也是一样的,我们就先选了所有的dp[v][1] 然后如果选这条边,那么差值就是dp[v][0]+w-dp[v][1]

找前面k大且大于0的数之和。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <queue>
#include <stack>
#include <bitset>
#include <vector>
#include <map>
#include <string>
#include <cstring>
#include <bitset>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=5e5+;
typedef long long ll;
ll dp[maxn][];
int n,k,head[maxn],cnt;
struct node{
int v,w,nxt;
node(int v=,int w=,int nxt=):v(v),w(w),nxt(nxt){}
}ex[maxn*]; void add(int u,int v,int w){
ex[cnt]=node(v,w,head[u]);
head[u]=cnt++;
ex[cnt]=node(u,w,head[v]);
head[v]=cnt++;
}
bool cmp(int a,int b){
return a>b;
} void dfs(int u,int pre){
dp[u][]=dp[u][]=;
for(int i=head[u];i!=-;i=ex[i].nxt){
int v=ex[i].v;
if(v==pre) continue;
dfs(v,u);
dp[u][]+=dp[v][];
dp[u][]+=dp[v][];
}
vector<int>val;val.clear();
for(int i=head[u];i!=-;i=ex[i].nxt){
int v=ex[i].v;
if(v==pre) continue;
val.push_back(dp[v][]+ex[i].w-dp[v][]);
}
sort(val.begin(),val.end(),cmp);
int len=val.size();
len=min(k,len);
for(int i=;i<len;i++){
if(val[i]<) break;
if(i<k-) dp[u][]+=val[i];
dp[u][]+=val[i];
}
} int main(){
int t;
scanf("%d",&t);
while(t--){
cnt=;
scanf("%d%d",&n,&k);
for(int i=;i<=n;i++) head[i]=-;
for(int i=;i<n;i++){
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
add(u,v,w);
}
dfs(,-);
printf("%lld\n",max(dp[][],dp[][]));
}
return ;
}

E. Paint the Tree 树形dp的更多相关文章

  1. 熟练剖分(tree) 树形DP

    熟练剖分(tree) 树形DP 题目描述 题目传送门 分析 我们设\(f[i][j]\)为以\(i\)为根节点的子树中最坏时间复杂度小于等于\(j\)的概率 设\(g[i][j]\)为当前扫到的以\( ...

  2. hdu-5834 Magic boy Bi Luo with his excited tree(树形dp)

    题目链接: Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others)    Memory Limit: ...

  3. CF 461B Appleman and Tree 树形DP

    Appleman has a tree with n vertices. Some of the vertices (at least one) are colored black and other ...

  4. codeforces 161D Distance in Tree 树形dp

    题目链接: http://codeforces.com/contest/161/problem/D D. Distance in Tree time limit per test 3 secondsm ...

  5. hdu6035 Colorful Tree 树形dp 给定一棵树,每个节点有一个颜色值。定义每条路径的值为经过的节点的不同颜色数。求所有路径的值和。

    /** 题目:hdu6035 Colorful Tree 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:给定一棵树,每个节点有一个颜色值.定 ...

  6. 5.10 省选模拟赛 tree 树形dp 逆元

    LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...

  7. Codeforces Round #263 Div.1 B Appleman and Tree --树形DP【转】

    题意:给了一棵树以及每个节点的颜色,1代表黑,0代表白,求将这棵树拆成k棵树,使得每棵树恰好有一个黑色节点的方法数 解法:树形DP问题.定义: dp[u][0]表示以u为根的子树对父亲的贡献为0 dp ...

  8. codeforces Round #263(div2) D. Appleman and Tree 树形dp

    题意: 给出一棵树,每个节点都被标记了黑或白色,要求把这棵树的其中k条变切换,划分成k+1棵子树,每颗子树必须有1个黑色节点,求有多少种划分方法. 题解: 树形dp dp[x][0]表示是以x为根的树 ...

  9. POJ 2486 Apple Tree(树形DP)

    题目链接 树形DP很弱啊,开始看题,觉得貌似挺简单的,然后发现貌似还可以往回走...然后就不知道怎么做了... 看看了题解http://www.cnblogs.com/wuyiqi/archive/2 ...

随机推荐

  1. leetcode c++做题思路和题解(1)——常规题总结

    常规题总结 0. 目录 两数之和 1. 两数之和 耗时4ms(98.82%),内存6.2m. 两数之和--寻找中值向两边扩散法 1.1 思路 思路很简单,就是先找数组中target/2的前后两个值,然 ...

  2. xml 文件 和xsd 文件的关系

    XML文件和XSD文件的关系 2010-09-29 15:38 2307人阅读 评论(0) 收藏 举报 xml 1. XSD文件在某个namespace中定义element和type.此处定义的typ ...

  3. 使用ffprobe 查询wav文件信息

    使用ffprobe 查询wav文件信息 安装 安装过程和ffmepg相同不在赘述 不带参数查询文件信息 ffprobe ZH_biaobei_标准合成_甜美女声_楠楠_5_5_5_6_1_4047db ...

  4. 【转】解决存储过程执行快,但C#程序调用执行慢的问题

    这两天遇到一个问题令人比较郁闷,一个大概120行左右的存储过程在SQL Server2012的查询分析器里面执行,速度非常理想,1秒不到,即可筛选抓取到大概500条数据记录.但在C#程序代码里调用,就 ...

  5. L17 AlexNet VGG NiN GoogLeNet

    深度卷积神经网络(AlexNet) LeNet: 在大的真实数据集上的表现并不尽如⼈意. 1.神经网络计算复杂. 2.还没有⼤量深⼊研究参数初始化和⾮凸优化算法等诸多领域. 机器学习的特征提取:手工定 ...

  6. 【翻译】借助 NeoCPU 在 CPU 上进行 CNN 模型推理优化

    本文翻译自 Yizhi Liu, Yao Wang, Ruofei Yu.. 的  "Optimizing CNN Model Inference on CPUs" 原文链接: h ...

  7. redis: List列表类型(四)

    list设置值(头部):lpush list one list设置值(尾部):**rpush ** list one list获取值:lrange list 0 -1 list获取指定范围的值:lra ...

  8. 基于MySQL Binlog的Elasticsearch数据同步实践

    一.为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品.订单等数据的多维度检索. 使用 Elasticsearch 存储业务数 ...

  9. 递归复制&查看文件夹下的指定后缀的文件

    <?php header("content-type:text/html;charset=utf8"); set_time_limit(0); $dir = "d: ...

  10. python学习22之函数式编程

    '''''''''1.高阶函数:将函数作为参数传递到另一个函数中,作为这个函数的参数,这样的方式叫高阶函数(1)map:两个参数,一个是函数,一个是iterator,将函数依次作用于Iterator中 ...