hdu 1561(树形DP)
来源:互联网 发布:淘宝怎样进闲鱼 编辑:程序博客网 时间:2024/05/20 06:54
hdu 1561
题目:http://acm.hdu.edu.cn/showproblem.php?pid=1561
先开始建图,发现可能成环,要先把所有的环都去掉,新建一个节点0,把a==0的点全都连到0上,然后就是root = 0 的一棵树。对每一个节点的所有儿子节点进行背包。后来看了网上的代码,发现都没考虑成环的情况,不知道是我想多了,本来就不需要考虑,还是很多人都没注意到。关于如何找出所有成环的点,先开始还没想到,问了一下,原来走一遍强连通接好了 = = 。后来我也写了个没判定成环的,果然是AC了。代码如下,d[i][j]表示以 i 为父亲节点,已攻克了 j 个城堡能获得最大值。状态转移方程:d[u][i] = max(d[u][i],d[u][j]+d[v][m-j]) ,j<i ,01背包注意循环顺序及初始化。为了方便,多了个0节点,所以m++。
代码如下:
#include<cstdio>#include<cstring>#include<algorithm>#include<vector>using namespace std;const int MAXN = 222 ;vector <int> G[MAXN];int val[MAXN];int n,m;int d[MAXN][MAXN];void dfs(int u){ for(int i=0;i<=m;i++) d[u][i]=0; d[u][1]=val[u]; for(int i=0;i<G[u].size();i++) { int v = G[u][i]; //printf("u = %d,v = %d\n",u,v); dfs(v); for(int j=m;j>=1;j--) { for(int k=0;k<j;k++) { d[u][j]=max(d[u][j],d[u][j-k]+d[v][k]); } } }}int main(){ while(~scanf("%d%d",&n,&m)) { if(n+m==0) break; for(int i=0;i<=n;i++) G[i].clear(); int a,b; for(int i=1;i<=n;i++) { scanf("%d%d",&a,&b); if(a>0) G[a].push_back(i); else G[0].push_back(i); val[i]=b; } val[0]=0; m++; dfs(0); printf("%d\n",d[0][m]); } return 0;}
- hdu 1561(树形DP)
- HDU 1561(树形dp)
- HDU 1561(树形DP)
- hdu 1561 树形DP
- hdu 1561(树形dp)
- hdu 1561 树形dp
- hdu 1561 树形dp
- HDU 1561 树形DP
- hdu 1561 树形dp
- hdu 1561 (树形dp+依赖背包)
- hdu 1561(树形dp)(背包dp)
- hdu 1561 简单树形dp
- HDU 1561 树形dp+背包
- hdu 1561简易树形DP
- hdu 1011(树形DP)
- (树形dp) hdu 1520
- HDU 1520(树形dp)
- HDU 1011(树形dp)
- MFC文件操作
- Linux硬盘检测
- 关于中断请求标志位
- 在VS2008中定制Visual C++项目向导
- 工業自動化中資料交換的新標準 - OPC
- hdu 1561(树形DP)
- wrapper在java应用中的bug
- 图---最短路径
- 利用CamtasiaStudio软件为英语视频自动添加英文字幕
- 利用ThreadLocal管理Hibernate Session
- 多吃防晒食物 肌肤白皙年轻
- Rfid通信2-网口模式
- 用Delphi开发OPC客户端工具的方法研究
- 最大最小堆介绍