-
transaction transaction transaction
HDU - 6201 - 我们设1为根节点,假设一开始一个人身上的钱为0。
- 我们设dp[i][0]表示从根节点走到i及其子树并中任一点买入一本书后这个人身上钱的最大值(显然是负的)。
- dp[i][1]表示从根节点走到i及其子树并中任一点卖出一本书后这个人身上钱的最大值(可正可负)。
- 那么我们对这棵树进行一次树形DP即可,dfs后对每个节点更新收益最大值,ans取最大值dp[i][0]+dp[i][1]
-
#include<bits/stdc++.h> using namespace std; #define maxn 100008 struct node { int v,w; }; int ans,val[maxn],u,v,w; int dp[maxn][2],n,t; vector<node>edge[maxn]; void dfs(int u,int pre) { dp[u][0]=-val[u]; dp[u][1]=val[u]; int len=edge[u].size(); for(int i=0; i<len; i++) { int v=edge[u][i].v; int w=edge[u][i].w; if(v==pre)continue; dfs(v,u); dp[u][0]=max(dp[u][0],dp[v][0]-w); dp[u][1]=max(dp[u][1],dp[v][1]-w); } ans=max(dp[u][0]+dp[u][1],ans); } int main() { scanf("%d",&t); while(t--) { scanf("%d",&n); for(int i=1; i<=n; i++) { edge[i].clear(); scanf("%d",&val[i]); } for(int i=1; i<n; i++) { scanf("%d%d%d",&u,&v,&w); edge[u].push_back((node){v,w}); edge[v].push_back((node){u,w}); } ans=0; dfs(1,-1); printf("%d\n",ans); } return 0; }
transaction transaction transaction HDU - 树形DP
最新推荐文章于 2022-07-03 23:18:30 发布