HDU1561 The more, The Better(树形dp)
2016-03-24 10:34
288 查看
题意:
给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值
思路:
树形dp搞一下,0为根节点,m要+1,dfs从0开始跑一遍就好了
给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值
思路:
树形dp搞一下,0为根节点,m要+1,dfs从0开始跑一遍就好了
/* *********************************************** Author :devil Created Time :2016/3/23 19:23:54 ************************************************ */ #include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <cmath> #include <stdlib.h> using namespace std; #define N 210 int n,m,dp ,v ; bool vis ; vector<int>eg ; void init() { for(int i=0;i<=n;i++) eg[i].clear(); memset(dp,0,sizeof(dp)); memset(vis,false,sizeof(vis)); } void dfs(int u) { vis[u]=true; dp[u][1]=v[u]; for(int i=0;i<eg[u].size();i++) { int to=eg[u][i]; if(!vis[to]) dfs(to); for(int j=m;j>=1;j--) for(int k=1;k<j;k++) dp[u][j]=max(dp[u][j],dp[u][k]+dp[to][j-k]); } } int main() { //freopen("in.txt","r",stdin); int x,y; while(~scanf("%d%d",&n,&m)&&(n+m)) { init(); for(int i=1;i<=n;i++) { scanf("%d%d",&x,&y); v[i]=y; eg[x].push_back(i); } m++; dfs(0); printf("%d\n",dp[0][m]); } return 0; }
相关文章推荐
- iOS常用宏定义
- oc-29-可变数组
- js、javascript正则表达式验证身份证号码
- Android ANR异常及解决方法
- HustOj使用脚本开启判题功能
- 【bzoj2179】FFT快速傅立叶 FFT
- 基于jenkins+gitlab+redmine构建持续集成环境(一)
- 杭电2074—叠筐
- Spring分层矛盾问题
- ios 遍历方式
- 在Mac上配置/使用Github
- 【操作系统】关于C语言设计程序退出自动关闭窗口的问题
- SQLServer 服务器架构迁移
- 工作日志的利器:迷人的MARKDOWN
- Codeforces 15E Trangles (计数)
- c++2
- Android SQLite性能分析
- 鼠标事件回放
- EBS-计划采购订单信息及接口数据
- Springmvc中@Autowired注解与@Resource注解的区别