11782 - Optimal Cut(树形DP+记忆化搜索)
来源:互联网 发布:淘宝如何注销实名认证 编辑:程序博客网 时间:2024/05/19 16:48
题目链接:11782 - Optimal Cut
题意:按前序遍历给定一棵满二叉树,现在有k次,可以选k个节点,获得他们的权值,有两个条件:
1、一个节点被选了,他的子节点就不能选了。
2、最终选完后,根到所有叶子的路径上,都要有一个被选的节点。
思路:树形dp,dp[u][k]代表在结点u,可以选k个节点,那么就分两种情况
选u节点,dp[u][k] = node[u];
选子节点之和,那么就把k次分配给左右孩子,dp[u][k] = max(dp[u][k], dp[u][i], dp[u][k - i]) (1<= i < k)
代码:
#include <stdio.h>#include <string.h>#define max(a,b) ((a)>(b)?(a):(b))const int N = (1<<20) + 5;const int M = 25;int h, k, node[N], dp[N][M], vis[N][M];void build(int u, int d) {memset(vis[u], 0, sizeof(vis[u]));if (d == h) return;scanf("%d", &node[u]);build(u * 2 + 1, d + 1);build(u * 2 + 2, d + 1);}void dfs(int u, int k, int d) {if (vis[u][k]) return;vis[u][k] = 1;dp[u][k] = node[u];if (d + 1 == h) return;for (int i = 1; i < k; i++) {int l = u * 2 + 1;int r = u * 2 + 2;dfs(l, i, d + 1);dfs(r, k - i, d + 1);dp[u][k] = max(dp[u][k], dp[l][i] + dp[r][k - i]);}}int main() {while (~scanf("%d", &h) && h != -1) {h++;scanf("%d", &k);build(0, 0);dfs(0, k, 0);printf("%d\n", dp[0][k]);}return 0;}
1 0
- 11782 - Optimal Cut(树形DP+记忆化搜索)
- uva 11782 - Optimal Cut (树形dp)
- uva 11782 - Optimal Cut(dp)
- UVA 12295 Optimal Symmetric Paths (spfa + 记忆化搜索)
- [笔记]: 记忆化搜索+hash优化&树形dp
- 【Codevs1163】访问艺术馆 树形dp 记忆化搜索(8/1000)
- 记忆化搜索(搜索+dp思想)
- dp记忆化搜索
- 记忆化搜索,dp
- 记忆化搜索DP
- poj 1088 (dp记忆化搜索)
- poj 1579(记忆化搜索)DP
- 滑雪(poj1088,DP+记忆化搜索)
- Lightoj 1036 DP(记忆化搜索)
- Lightoj 1084 记忆化搜索(DP)
- hdu1978(记忆化搜索/DP)
- loj 1044(dp+记忆化搜索)
- hdu3555(数位dp记忆化搜索)
- 梅式砝码问题
- 移动硬盘根目录里的msdia80.dll文件
- SqlServer2008r2在查询时将两列合并显示
- ZIGBEE中Profile、Cluster和Attribute关系
- 原型模式——浅复制VS深复制
- 11782 - Optimal Cut(树形DP+记忆化搜索)
- java对文件的读写
- 多继承的时候如果两个父类中出现了同样的方法,而你要在子类调用此方法,调用时请加类限定符
- JavaScript跨域总结与解决办法
- 逆波兰式的实现(栈实现)
- [LeetCode] Pascal's Triangle II
- MySQL- SHOW TABLE STATUS命令
- Service-startService启动的服务(1)
- iOS 基础类解析 - NSObject