HDU1561 树形DFS+DP
来源:互联网 发布:聊城气象数据 编辑:程序博客网 时间:2024/06/06 17:28
题意:ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?
#include<stdio.h>#include<string.h>#define N 205int n,m,edgeNum=0;int ans[N],dp[N][N],f[N][N];int visit[N],head[N];struct Line{int v,next;}edge[N];int max(int a,int b){return a>b?a:b;}void add(int u,int v){ edge[edgeNum].v=v; edge[edgeNum].next=head[u]; head[u]=edgeNum++;}void dfs(int root){ visit[root]=1; for(int i=head[root];i!=-1;i=edge[i].next) { int u=edge[i].v; if(!visit[u]) { dfs(u); for(int k=m;k>=0;k--) for(int j=0;j<=k;j++) f[root][k]=max(f[root][k],f[root][k-j]+dp[u][j]); } } for(int i=1;i<=m+1;i++) dp[root][i]=f[root][i-1]+ans[root];}int main(){ int a,b; freopen("a.txt","r",stdin); while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; edgeNum=ans[0]=0; memset(f,0,sizeof(f)); memset(dp,0,sizeof(dp)); memset(head,-1,sizeof(head)); memset(visit,0,sizeof(visit)); for(int i=1;i<=n;i++) { scanf("%d%d",&a,&b); ans[i]=b; add(a,i); } dfs(0); printf("%d\n",dp[0][m+1]); }}
阅读全文
0 0
- HDU1561 树形DFS+DP
- hdu1561 树形DP+背包
- hdu1561树形DP入门
- hdu1561 树形dp 背包
- hdu1561之树形dp
- hdu1561,树形dp+背包
- hdu1561树形dp
- hdu1561 树形dp
- hdu1561(树形dp)
- hdu1561(树形dp)
- 树形dp-hdu1561
- hdu1561 树形DP
- HDU1561【树形DP】
- hdu1561 树形dp
- hdu1561树形dp 01背包
- hdu1561(树形DP+背包问题)
- hdu1561树形dp+依赖背包
- HDU1561 树形dp,泛化背包
- Cmd执行带包名的Java文件
- linux
- PAT乙级 1035. 插入与归并(25)
- 浅谈CountDownLatch的用法
- [日推荐]『Brick4积木』乐高迷不可错过的小工具
- HDU1561 树形DFS+DP
- JS分页
- 支付宝
- 【jzoj5358】【NOIP2017提高A组模拟9.12】【BBQ】
- 线性化与串行化比较
- C++编程题1——输入字符串,输出数字最小的值
- K最近邻算法(介绍)
- MATLAB-轨道分叉
- spring父子容器