求助!dalao帮忙看看

P2015 二叉苹果树

```cpp void dfs(int x,int fa) { for(int i=head[x];i;i=tree[i].next) { if(tree[i].to!=fa) { dp[tree[i].to][1]=tree[i].w; dfs(tree[i].to,x); for(int j=q;j>0;--j) { for(int k=0;k<=j;++k) { if((j!=1&&k!=j)||x==1) { dp[x][j]=max(dp[x][j],dp[x][j-k]+dp[tree[i].to][k]); } } } } } return ; } ```
by 马桶战神 @ 2021-08-20 22:13:45


树形dp最好往记忆化递归想,其实记忆化递归本质上就是dp,记忆化递归最关键的也是找状态方程和设置状态数组,这题dp[i][j]定义为第i个节点当前剩下k个边可取的情况下的最大苹果值 由于相当于度为2的树,那么其实就是左子树从k取到0加上右子树从0取到k dp[i][k] = (k = q-0)max(dp[2i+1][k]+dp[2i+2][q-k])
by WhyCodePo @ 2022-04-11 19:28:46


|