HDU 1561 The more, The Better / 树形DP
2014-03-21 22:55
113 查看
树形DP 选m个节点权值加起来最大
因为可能是森林 就是都没有限制就可以选 去一个超级源点0 这样就是一棵树了
然后就是基础的树形DP了 DP方程很好想 也很好转移
因为可能是森林 就是都没有限制就可以选 去一个超级源点0 这样就是一棵树了
然后就是基础的树形DP了 DP方程很好想 也很好转移
#include <cstdio> #include <cstring> #include <vector> using namespace std; const int maxn = 210; struct node { int v, w; }; vector <node> G[maxn]; int n, m; int dp[maxn][maxn]; int a[maxn]; int sum[maxn]; void dfs(int u) { sum[u] = 1; dp[u][1] = a[u]; for(int i = 0; i < G[u].size(); i++) { node x = G[u][i]; int v = x.v; dfs(v); sum[u] += sum[v]; int mm = m; mm = min(m, sum[u]); for(int j = mm+1; j >= 1; j--) { for(int k = 0; k < j; k++) { dp[u][j] = max(dp[u][j], dp[u][j-k]+dp[v][k]); } //printf("%d\n", dp[u][j]); } } } int main() { while(scanf("%d %d", &n, &m) && (n+m)) { for(int i = 0; i <= n; i++) G[i].clear(); for(int i = 1; i <= n; i++) { int u, v, w; scanf("%d %d", &u, &w); v = i; G[u].push_back((node){v, w}); a[i] = w; } memset(dp, 0, sizeof(dp)); memset(sum, 0, sizeof(sum)); dfs(0); printf("%d\n", dp[0][m+1]);//+1是因为0也算进去了 } return 0; }
相关文章推荐
- 如何在Linux WPS(Kingsoft Office)中使用windows字体
- Linux服务器导入导出SVN项目版本库
- 黑马程序员_OC语言的点语法和合成存取方法
- nmt
- 黑马程序员-第二十四天(网络编程)
- 字符串转日期 19080101转成1980-01-01
- 实现右下角弹窗效果和发送邮件的功能
- 14.7: 错误处理
- 一种基于众核GPU上高性能的基于比较的排序算法[1]
- Discuz!$_G变量的使用方法
- 我的命名规范
- lcd测试
- hdu4628之状态压缩dp
- UVa1554 - Binary Search
- 关于加强保护网站安全的想法--引于IDF博文
- HDU 1676 Full Tank? 限制最短路(difficult)
- linux 简单的mysql备份和导入,以及文件的备份和导入
- 使用 Video4Linux 采集USB摄像头的图像,并保存到一张 jpg图像文件中的程序
- 仿jdk的LinkedList代码实现
- Facebook HHVM 和 Hack 手册----1.什么是Hack?