POJ2486 Apple Tree 树形DP
2017-02-11 16:18
387 查看
题意:给你一个图,每个点有一些权值,问你在k步内怎么得到最大权值。(一个点的权值只能获得一次)。n<=300。
题解:一开始:我去这不水题,直接f[i,j]i节点走j步这不随便搞?结果改了半天样例过不了,才发现可以往回走= =,然后就懵比了。
事实上,对于多出来的条件限制。我们可以对应的加上一维来推导,即设f[i,j,0/1]表示是否会回到i这个点。那么就可以直接推导了。
如果当前不回到i点:
1.先遍历子树v然后遍历其他子树:f[i,j,0]=max(f[i,j,0],f[i,j-k,0]+f[v,k-2,1]);//k是在v内走的步数,-2是i到v的距离(*2)。
2.反过来,先搞其他子树然后在v:f[i,j,0]=max(f[i,j,0],f[i,j-k,1]+f[v,k-1,0])//因为不用回到i所以就可以少减去1步。
回到i点:
f[i,j,1]=max(f[i,j,1],f[i,j-k,1]+f[v,k-2,1]);
code:
题解:一开始:我去这不水题,直接f[i,j]i节点走j步这不随便搞?结果改了半天样例过不了,才发现可以往回走= =,然后就懵比了。
事实上,对于多出来的条件限制。我们可以对应的加上一维来推导,即设f[i,j,0/1]表示是否会回到i这个点。那么就可以直接推导了。
如果当前不回到i点:
1.先遍历子树v然后遍历其他子树:f[i,j,0]=max(f[i,j,0],f[i,j-k,0]+f[v,k-2,1]);//k是在v内走的步数,-2是i到v的距离(*2)。
2.反过来,先搞其他子树然后在v:f[i,j,0]=max(f[i,j,0],f[i,j-k,1]+f[v,k-1,0])//因为不用回到i所以就可以少减去1步。
回到i点:
f[i,j,1]=max(f[i,j,1],f[i,j-k,1]+f[v,k-2,1]);
code:
#include<iostream> #include<cstring> #include<cmath> #include<algorithm> #include<cstdio> #define fo(i,a,b) for(int i=a;i<=b;i++) #define fd(i,a,b) for(int i=a;i>=b;i--) using namespace std; int n,m,p,ans,tot; int f[305][305][3],a[1000]; int next[10000],go[10000],head[10000]; inline void add(int x,int y) { go[++tot]=y; next[tot]=head[x]; head[x]=tot; } inline void dfs(int x,int fa) { int i=head[x],v; while (i) { v=go[i]; if(v!=fa) { dfs(v,x); fd(j,p,1) { fo(k,1,j) { f[x][j][0]=max(f[x][j][0],f[x][j-k][1]+f[v][k-1][0]), f[x][j][0]=max(f[x][j][0],f[x][j-k][0]+f[v][k-2][1]); f[x][j][1]=max(f[x][j][1],f[x][j-k][1]+f[v][k-2][1]); } } } i=next[i]; } } int main() { while(~scanf("%d%d",&n,&p)) { memset(head,0,sizeof(head)); memset(f,0,sizeof(f)); tot=0,ans=0; fo(i,1,n) { scanf("%d",&a[i]); fo(j,0,p) f[i][j][0]=f[i][j][1]=a[i]; } fo(i,1,n-1) { int x,y; scanf("%d%d",&x,&y); add(x,y); add(y,x); } dfs(1,0); printf("%d\n",max(f[1][p][0],f[1][p][1])); } return 0; }
相关文章推荐
- POJ2486:Apple Tree(树形DP) ★
- poj2486 Apple Tree (树形dp)
- 【poj2486】【Apple Tree】【树形dp】
- poj2486 Apple Tree 树形DP
- POJ2486:Apple Tree(树形DP)
- POJ2486 Apple Tree(树形DP)
- POJ2486 apple tree(树形DP)
- poj2486 Apple Tree (树形dp)
- poj2486 Apple Tree(树形DP,有反回的情况,求最大)........很典型
- poj2486 Apple Tree 树形dp
- poj_2486 Apple Tree(树形dp)
- poj2486--Apple Tree(树状dp)
- URAL 1018 Binary Apple Tree(树形dp入门题)
- poj 2486 Apple Tree (树形背包dp)
- ural 1018 Binary Apple Tree(树形dp | 经典)
- POJ - 2486 Apple Tree(树形DP)
- Ural 1018 Binary Apple Tree [树形dp]
- poj2486 Apple Tree 树形dp背包
- poj2486(树形dp)
- CodeForces 349D Apple Tree(树形DP)