HDU 1561 The more, The Better
2016-01-10 22:08
337 查看
题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1561题意:
有许多城堡,攻克就可以拿到其中的宝藏,攻克某个城堡可能需要先攻克另一个城堡。问攻克m个城堡能够拿到的最多宝藏。思路:
就是点技能点的问题。树形dp,把能够直接点的根节点连接到0点上,然后取以0为根节点的树取m+1个点的最大值。f[i][j]就是以i为根节点的子树中取j个点的最大值。从树叶开始向上遍历就行了。
代码:#define INF 0x3f3f3f3f
#define N 1123
int n,m;
vector<int>v
;
int f
;
void dfs(int k)
{
int i,j,t;
for(i=0;i<v[k].size();i++)
dfs(v[k][i]);
for(t=0;t<v[k].size();t++)
for(i=m;i>0;i--)
for(j=1;j<i;j++)
f[k][i]=max(f[k][i],f[k][i-j]+f[v[k][t]][j]);
}
int main()
{
int i,j,k,kk,cas,T,t,x,y,z;
while(scanf("%d%d",&n,&m)!=EOF&&n)
{
m++;
for(i=0;i<=n;i++)
v[i].clear();
for(i=0;i<=n;i++)
for(j=0;j<=m;j++)
f[i][j]=-INF;
for(i=1;i<=n;i++)
{
scanf("%d%d",&x,&y);
v[x].push_back(i);
f[i][1]=y;
}
f[0][1]=0;
dfs(0);
printf("%d\n",f[0][m]);
}
return 0;
}
相关文章推荐
- const 使用一二
- css实现在div中垂直水平居中
- 最终个人作业
- poj-1125-Stockbroker Grapevine spfa模板
- javascript的特点
- rtmp发送H264及aac的音视频
- 使用adapter的notifyDataSetChanged时列表数据没有刷新
- 雷锋举报了快播
- 浅析多线程
- synchronized 用法总结
- Servlet3.0注解新特性笔记 (转载IBM)
- HPU:1879畅通工程(kruskal)
- document.body.scrollTop用法
- 触摸事件
- PPAPI插件与浏览器的交互过程
- 使用gdb调试Nginx worker进程
- UIScreen、UIWindow、UIView浅析
- 面试经历---YY欢聚时代(2015年11月21日上午初试、25日下午复试)
- Crazepony软件框架讲解
- 2016第一周日