很好的树形DP入门题,看着和选课那道题如出一辙。

Problem Description
ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?
 
Input
每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);在接下来的N行里,每行包括2个整数,a,b. 在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。当N = 0, M = 0输入结束。
 
Output
对于每个测试实例,输出一个整数,代表ACboy攻克M个城堡所获得的最多宝物的数量。
 
Sample Input
3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0
 
Sample Output
5 13
  
  直接上代码啦:

 #include <iostream>
#include <cstdio>
#include <cstring> using namespace std; int dp[][],map[][];
int num[];
bool visited[];
int N,M; inline int max(int a,int b)
{
if(a>b) return a;
return b;
} int TreeDP(int father)
{
visited[father]=true; //第father号城市已访问过
for(int i=;i<=num[father];i++) //遍历以father为根节点的子节点
{
int son=map[father][i];
if(!visited[son]) TreeDP(son);//递归遍历直至为叶子节点,然后返回
for(int j=M;j>=;j--)//j>=2的原因是输入a,b是j=1已经考虑进去了
for(int k=;k<j;k++)//拆分
{
if(dp[father][j-k]!=-&&dp[son][k]!=-)//是否可以进行拆分
dp[father][j]=max(dp[father][j],dp[father][j-k]+dp[son][k]);//由状态转移方程式得
}
}
}
int main()
{
//dp[i][j]代表的是攻克包括第i号城市在内的共j座城市所获得的财富值
int a,b;
while(scanf("%d %d",&N,&M),N||M)//M原本代表ACBoy要攻打城市的个数,但为了方便森林变成数时更好统计就把M++,这样0号城市也纳入其中
{
memset(dp,-,sizeof(dp));
memset(num,,sizeof(num));//num[father]表示以father为根节点的子节点个数有多少个
dp[][]=;
for(int i=;i<=N;i++)
{
scanf("%d %d",&a,&b);
dp[i][]=b; //攻打第i号城市的财富值
map[a][++num[a]]=i; //构成一棵树,第0号城市为根节点
}
M++;
for(int i=;i<=N;i++)//初始化
{
dp[i][]=;
visited[i]=false;
}
TreeDP();
printf("%d\n",dp[][M]);
} return ;
}

dp[i][j]代表的是包括第i座城市在内的共j座城市所获得的最大财富值

最新文章

  1. 浅谈HTML5单页面架构(二)——backbone + requirejs + zepto + underscore
  2. cpu主频信息
  3. 烂泥:nagios学习(四):pnp4nagios图形化绘制nagios数据
  4. c# 验证码类
  5. 锋利的jQuery-4--停止动画和判断是否处于动画状态(防止动画加入队列过多的办法)
  6. POJ 1054 The Troublesome Frog(枚举+剪枝)
  7. jquery实现2级联动
  8. void (*f(int, void (*)(int)))(int) 函数解析 转
  9. 高清摄像头MIPI接口与ARM处理器的连接
  10. perl 获取文件内容里第一个AAA和最后一个AAA
  11. 虚拟机安装windows7 VMware12 安装window7
  12. java程序可以跨平台运行的原因
  13. 自动化测试框架对比(UIAutomator、Appium)
  14. php处理文件上传
  15. 3ds max学习笔记(十四)-- (FFD自由变形)
  16. Tensorflow-hub[例子解析2]
  17. Alpha、伪Beta 发布个人感想与体会
  18. 自学Aruba6.2-控制器基本维护操作(web页面配置)
  19. KVM虚拟化技术(六)磁盘管理
  20. 通过ES6实现的Ajax类

热门文章

  1. Tomcat起了一个测试桩,调用该测试桩无响应
  2. java代码getHostAddress .getHostName()的练习
  3. java代码,实现输入编号,输出对应水果的单价~~~~
  4. Java-Maven-Runoob:Maven 构建配置文件
  5. 初学者手册-IDEA常用快捷键
  6. php创建token
  7. mysql库操作
  8. Mycat主从模式下的读写分离与自动切换
  9. java8新特性-lambda表达式和stream API的简单使用
  10. oracle语言基础