算法训练 结点选择【树形动态规划】
2018-03-04 16:51
176 查看
问题描述
有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?输入格式第一行包含一个整数 n 。接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。接下来一共 n-1 行,每行描述树上的一条边。输出格式输出一个整数,代表选出的点的权值和的最大值。样例输入5
1 2 3 4 5
1 2
1 3
2 4
2 5样例输出12样例说明选择3、4、5号点,权值和为 3+4+5 = 12 。数据规模与约定对于20%的数据, n <= 20。对于50%的数据, n <= 1000。对于100%的数据, n <= 100000。权值均为不超过1000的正整数。
dp[1][i] 表示取当前节点的最大值。
dp[0][i] 表示不去当前节点的最大值。
由于数据是一棵数,所以从任意节点开始dfs都可以。注意标记。
dp[1][u]+=dp[0][v]; //取当前节点,那么加上不取邻接点的dp值
dp[0][u]+=max(dp[0][v],dp[1][v]); //不取当前节点,那么需要加上取或不取邻接点dp值的最大值。
因为需要取一层,所以需要用+=。
有一棵 n 个节点的树,树上每个节点都有一个正整数权值。如果一个点被选择了,那么在树上和它相邻的点都不能被选择。求选出的点的权值和最大是多少?输入格式第一行包含一个整数 n 。接下来的一行包含 n 个正整数,第 i 个正整数代表点 i 的权值。接下来一共 n-1 行,每行描述树上的一条边。输出格式输出一个整数,代表选出的点的权值和的最大值。样例输入5
1 2 3 4 5
1 2
1 3
2 4
2 5样例输出12样例说明选择3、4、5号点,权值和为 3+4+5 = 12 。数据规模与约定对于20%的数据, n <= 20。对于50%的数据, n <= 1000。对于100%的数据, n <= 100000。权值均为不超过1000的正整数。
思路:
树形dp可以用dfs来实现。dp[1][i] 表示取当前节点的最大值。
dp[0][i] 表示不去当前节点的最大值。
由于数据是一棵数,所以从任意节点开始dfs都可以。注意标记。
dp[1][u]+=dp[0][v]; //取当前节点,那么加上不取邻接点的dp值
dp[0][u]+=max(dp[0][v],dp[1][v]); //不取当前节点,那么需要加上取或不取邻接点dp值的最大值。
因为需要取一层,所以需要用+=。
代码:
#include<stdio.h> #include<string.h> #include<ctype.h> #include<algorithm> #include<vector> using namespace std; #define inf 1<<29 int n,a[100000+5],dp[2][100000+5]; vector<int> G[100000+5]; bool vis[100000+5]; void dfs(int u) { vis[u]=1; for(int i=0;i<G[u].size();i++) { int v=G[u][i]; if(vis[v]) continue; dfs(v); dp[1][u]+=dp[0][v]; dp[0][u]+=max(dp[0][v],dp[1][v]); } dp[1][u]+=a[u]; } int main() { scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); memset(dp,0,sizeof dp); for(int i=1;i<=n;i++) G[i].clear(); int u,v; for(int i=1;i<n;i++) { scanf("%d%d",&u,&v); G[u].push_back(v); G[v].push_back(u); } memset(vis,0,sizeof vis); dfs(1); printf("%d\n",max(dp[0][1],dp[1][1])); return 0; }
相关文章推荐
- 蓝桥杯 算法训练 结点选择 (树形动态规划)
- 蓝桥杯 算法训练 结点选择 (树形动态规划)
- 蓝桥杯 算法训练 结点选择 树形动态规划
- 蓝桥杯 算法训练 结点选择 DP(SDNU 1482.结点选择)
- 算法训练 结点选择
- 算法训练 结点选择 (树形DP)
- 算法训练:结点选择
- 算法训练 结点选择
- 算法训练 结点选择 (树形dp)(点权)
- 算法-蓝桥杯-算法训练 结点选择(JAVA)
- 蓝桥杯 - 算法训练 - ALGO - 4 结点选择 (经典树形DP)
- 蓝桥杯 算法训练-结点选择
- 算法训练 结点选择
- 算法训练 结点选择 蓝桥杯
- 算法训练 结点选择
- 蓝桥杯,算法训练 结点选择(简箪的树形DP)
- 算法训练 结点选择
- 算法训练 结点选择 (无向边树形DP)
- 算法训练 结点选择
- 算法训练 结点选择 树dp