HihoCoder - 1055 树形dp
2024-08-29 21:19:33
vj链接:https://vjudge.net/contest/367007#problem/G
题意:
给你一棵树,树上有n个节点,每一个节点有一个权值,树根节点是1,你需要找到以1为起点连通的m个点的最大的权值(连通的意思也就是:这m个点在从1点遍历树的时候,有这样的一个序列)
题解:
dp[x][i]表示:以x为起点,连通量为i的最大权值
dp转移方程:
for(int i=m;i>1;--i) //因为每一个节点只能用一次,所以要像01背包一样循环
{
for(int j=0;j<i;++j)
{
dp[x][i]=max(dp[x][i],dp[x][i-j]+dp[v][j]); //v就是这条边的终点
}
}
因为我们要求dp[1][m]所以我们要先找到子树节点的dp值,然后由子树结点的值去求出来根节点的最优值
这个dp的过程也类似于背包容量为m的01背包
代码:
1 #include<stdio.h>
2 #include<string.h>
3 #include<iostream>
4 #include<algorithm>
5 #include<math.h>
6 #include<vector>
7 #include<queue>
8 #include<stack>
9 #include<map>
10 using namespace std;
11 typedef long long ll;
12 const int maxn=105;
13 const int INF=0x3f3f3f3f;
14 const double eps=1e-8;
15 const double PI=3.1415926;
16 const int mod = 1e9+7;
17 int val[maxn],dp[maxn][maxn];
18 int n,m;
19 vector<int>w[maxn];
20 void dfs(int x,int pre) //x代表起点
21 {
22 dp[x][1]=val[x];
23 for(int i=0;i<w[x].size();++i) //这个相当于背包dp枚举物品那一层for循环
24 {
25 int v=w[x][i];
26 if(v!=pre)
27 {
28 dfs(v,x);
29 for(int i=m;i>1;--i) //因为每一个节点只能用一次,所以要像01背包一样循环
30 {
31 for(int j=0;j<i;++j)
32 {
33 dp[x][i]=max(dp[x][i],dp[x][i-j]+dp[v][j]);
34 }
35 }
36 }
37 }
38 }
39 int main()
40 {
41 scanf("%d%d",&n,&m);
42 for(int i=1;i<=n;++i)
43 scanf("%d",&val[i]);
44 for(int i=1;i<n;++i)
45 {
46 int x,y;
47 scanf("%d%d",&x,&y);
48 w[x].push_back(y);
49 w[y].push_back(x);
50 }
51 dfs(1,0);
52 printf("%d\n",dp[1][m]);
53 return 0;
54 }
最新文章
- ***Linux下使用git命令及github项目
- ubuntu下安装了express2.5.8,如何更新它?
- javascript学习笔记1-document.write
- CLR via C#(15)--String,熟悉而又陌生
- HDU 5452 Minimum Cut
- (2015年郑州轻工业学院ACM校赛题) A 彩票
- Permutations,Permutations II,Combinations
- sbt公布assembly解决jar包冲突 deduplicate: different file contents found in the following
- OpenCV3.0.0+win10 64位+vs2015环境的下载,安装,配置
- 取得GridView某行的DataKey
- Linux 服务器设置成支持中文
- OSG嵌入QT(QT界面使用Qt Designer编辑)
- 美团分布式服务通信框架及服务治理系统OCTO
- JZ2440学习笔记之中断
- en-zh(社会问题)social problems-2
- 副本集mongodb 无缘无故 cpu异常
- ACM-ICPC 2018年北京网络赛 D-80 days
- [USACO09JAN]Earthquake Damage
- [shell] bash数组(for时排序)
- 配置tomcat全局c3p0连接池
热门文章
- 有了链路日志增强,排查Bug小意思啦!
- 【Git】2、Linux快速安装Git环境 & oh-my-zsh
- mysql的安全问题
- 【Linux】常用的Linux可插拔认证模块(PAM)应用举例:pam_limits.so、pam_rootok.so和pam_userdb.so模块
- ctfhub技能树—信息泄露—备份文件下载—.DS_Store
- 宝塔的url计划任务
- Eureka详解系列(一)--先谈谈负载均衡器
- linux下安装zsh和p10k的详细过程
- 一步步使用SpringBoot结合Vue实现登录和用户管理功能
- JVM重新认识(一)oop-klass模型--HSDB使用验证