hdu4616 树形dp,分治思想
来源:互联网 发布:热血传奇装备数据库 编辑:程序博客网 时间:2024/05/21 15:06
刚做这题的时候感觉很麻烦,而别人却说是经典题,当时我一点儿没看出来经典。。。知道今天看了漆子超的论文,里面第一个例题就和这个差不多。
先是分治思想,然后对于每个根节点,大概想像成向下拉了许多条链出来就行了,有个小技巧可以将时间复杂度降低。
#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>using namespace std;typedef long long ll;const int maxn=50005;const int inf=0x3fffffff;ll val[maxn];int trap[maxn];ll ans,n,cc;ll dp[maxn][5][2];struct edge{ int to,next;}ee[maxn*2];int e[maxn],ecnt;void addedge(int u,int v){ ee[ecnt].to=v;ee[ecnt].next=e[u];e[u]=ecnt++; ee[ecnt].to=u;ee[ecnt].next=e[v];e[v]=ecnt++;}void init(){ int i,j,k; for(i=1;i<=n;++i) { for(j=0;j<=cc;++j) { for(k=0;k<2;++k) { dp[i][j][k]=-inf; } } }}void dfs(int f,int u){ int v,i,j,k; dp[u][trap[u]][trap[u]]=val[u]; for(i=e[u];i!=-1;i=ee[i].next) { v=ee[i].to; if(v==f) continue; dfs(u,v); for(j=0;j<=cc;++j) { for(k=0;j+k<=cc;++k) { if(j+k<cc) { ans=max(ans,dp[u][j][0]+dp[v][k][0]); } if(j+k<=cc) { ans=max(ans,dp[u][j][1]+dp[v][k][1]); } if(j!=cc) { ans=max(ans,dp[u][j][0]+dp[v][k][1]); } if(k!=cc) { ans=max(ans,dp[u][j][1]+dp[v][k][0]); } } } for(j=0;j<cc;++j) { dp[u][j+trap[u]][0]=max(dp[u][j+trap[u]][0],dp[v][j][0]+val[u]); dp[u][j+trap[u]][1]=max(dp[u][j+trap[u]][1],dp[v][j][1]+val[u]); } if(trap[u]==0) { dp[u][cc][1]=max(dp[u][cc][1],dp[v][cc][1]+val[u]); } }}int main(){ int t,i,j,u,v; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&cc); for(i=1;i<=n;++i) { scanf("%d%d",&val[i],&trap[i]); } memset(e,-1,sizeof(e));ecnt=0; for(i=1;i<n;++i) { scanf("%d%d",&u,&v); u++;v++; addedge(u,v); } init(); ans=-inf; dfs(-1,1); printf("%d\n",ans); } return 0;}
- hdu4616 树形dp,分治思想
- hdu4616 树形DP
- hdu4616(树形dp)
- 树形dp--hdu4616
- hdu4616(树形dp)
- hdu4616 树形dp
- 树形DP(HDU4616)
- hdu4616 Game 【树形dp】
- HDU4616 Game (树形DP/搜索)
- POJ1741Tree(树形dp/树分治)
- hdu4616 树形dp(有限制的权值最大链)
- poj 1741 Tree(树形DP+分治)难
- POJ 1741 Tree 树形DP(分治)
- 树形dp之树的分治
- POJ1741 Tree (树形dp+点分治)
- bzoj2152(树形dp或点分治)
- [BZOJ 4726] Sabota? 树形DP+贪心思想
- poj1741Tree 树的分治 树形dp 男人八题....
- 项目管理之沟通和计划
- 单独启动tomcat
- 强连通分量Tarjan模板
- Window/.Net程序员如何用最简单的方式掌握Linux的本质
- POJ 1523、ZOJ 1119 SPF - from lanshui_Yang
- hdu4616 树形dp,分治思想
- 【解题报告】POJ 3270 Cow 置换群基础 -- 轮换
- 【原】常见CSS3属性对ios&android&winphone的支持
- C语言生产者与消费者-随机数实现
- nodejs+express+socketio实现即时聊天系统初体验
- Unity3d Transform.DetachChildren使用
- @Local注释和@Remote注释不能一起使用
- hdu 1505 City Game (hdu 1506的升级版)
- HDU 4565 So Easy!