poj2486
来源:互联网 发布:淘宝网韩版女装 编辑:程序博客网 时间:2024/06/05 06:09
/* 题意:给你一个树, 树上的每个节点都会有点权, 现在小红帽从1节点开始去其他子树, 小红帽每到一个地方便拿走这个树的结点的点权 ,小红帽可以回来, 问你小红帽在不超过k步的情况下拿走的最大点权是多少? tag:树形dp 分析:我们定义dp[u][k][0]为从u结点到各个子树走不超过k步回来的情况下拿到的最大权值, dp[u][k][1]为从u结点到各个子树不超过k步不回来 的情况下拿到的最大权值。那么dp[u][k][0] = max(dp[v][j-2][0] + dp[u][k-j][0]) dp[u][k][1] = max(dp[v][j-1][1] + dp[u][k-j][0]) dp[u][k][1] = max(dp[v][j-2][0] + dp[u][k-j][1]) 注意计算顺序,我们要将k从大到小枚举才能保证走其他子树的时候不走v这个子树。*/#include <cstdio>#include <cstring>#include <iostream>#include <vector>using namespace std;const int maxn = 200 + 10;int N, K;int nweight[maxn];vector<int> G[maxn];int dp[maxn][maxn][2];void dfs(int fa, int u) { for(int i=0; i<=K; i++) dp[u][i][0] = dp[u][i][1] = nweight[u]; for(int i=0; i<G[u].size(); i++) { int v = G[u][i]; if(v == fa) continue; dfs(u, v); for(int k=K; k>=0; k--) //从大到小防止重复计算 for(int j=0; j<=k; j++) { int ans = dp[u][k-j][0]; if(j-2>=0) ans += dp[v][j-2][0]; dp[u][k][0] = max(dp[u][k][0], ans); ans = dp[u][k-j][0]; if(j-1>=0) ans += dp[v][j-1][1]; dp[u][k][1] = max(dp[u][k][1], ans); ans = dp[u][k-j][1]; if(j-2>=0) ans += dp[v][j-2][0]; dp[u][k][1] = max(dp[u][k][1], ans); } }}int main() { while(scanf("%d%d", &N, &K) == 2) { for(int i=1; i<=N; i++){ scanf("%d", &nweight[i]); G[i].clear(); } for(int i=1; i<=N-1; i++) { int u, v; scanf("%d%d", &u, &v); G[u].push_back(v); G[v].push_back(u); } dfs(-1, 1); int ans = max(dp[1][K][0], dp[1][K][1]); printf("%d\n", ans); } return 0;}
0 0
- poj2486
- poj2486
- poj2486
- 【DP】poj2486
- POJ2486--Apple Tree
- poj2486解题报告
- poj2486 Apple Tree
- poj2486 Apple Tree
- poj2486 树形dp
- poj2486 Apple Tree
- poj2486 apple tree
- POJ2486【树形DP】
- poj2486 Apple Tree 题解
- poj2486(树形dp)
- POJ2486:Apple Tree(树形DP)
- poj2486 Apple Tree 树形dp
- poj2486--Apple Tree(树状dp)
- 【poj2486】【Apple Tree】【树形dp】
- 天纵智能软件快速开发平台群发插件
- 【年终总结】-在路上
- winsocket c++ 阻塞方式
- 基于jdk1.8的ThreadPoolExecutor源码分析
- android uevent
- poj2486
- Android之实现滑动的七种方法总结
- Hive安装与部署
- iOS 提交NSArray到后台,把里面的数组转换字符串
- JAVA环境变量的配置
- 天纵智能软件快速开发平台传真插件
- 身份证实名认证
- ViewPager的页面滑动监听事件onPageChangeListener
- java recursive call 递归调用