1083A - The Fair Nut and the Best Path(树形DP)

    xiaoxiao2022-07-13  161

    题意:每个节点都有自己的价值,从一个节点走到另一个节点会消耗固定值,但也会得到这个节点的价值,问怎样走才能得到最大的价值。

    思路:利用树形结构进行dp,初始化每个点的价值为自身价值,对于每个节点都判断更新它的值或者不更新,从底向上进行dfs递归,更新出最优ans,从一个节点到另一个节点的收益为(目标节点价值-路上消耗的价值)

    题意:到达一个点的到这个点的价值,经过一个边花费这个边的价值,求得到的最大价值

    题解:dp[i] 保存从i 节点开始走向子节点得到的最大价值,每走一个子代更新一下 结果 和 dp[i] 即可

    #include<bits/stdc++.h> using namespace std; //string s[210]; //bool vis[110]; typedef long long ll; const int maxn = 3e5 + 5; std::vector<pair<ll,ll> > v[maxn]; int val[maxn],n; ll dp[maxn]; ll ans; void dfs(int u , int fa){ dp[u] = val[u]; ans = max(ans ,dp[u]); for(int i = 0 ; i < v[u].size(); i++){ int to = v[u][i].first; if(to == fa) continue ; dfs(to,u); ans = max(ans , dp[to] + dp[u] - v[u][i].second); dp[u] = max(dp[u],val[u] + dp[to] - v[u][i].second); } } int main(){ int x , y ,z; cin >> n; for(int i = 1; i <= n ; i++) cin >> val[i]; for(int i = 1; i < n ; i++){ cin >> x >> y >> z; v[x].push_back(make_pair(y,z)); v[y].push_back(make_pair(x,z)); } dfs(1,0); cout << ans << endl; return 0; }

    感想:没法直接保存最优值的话,利用一个变量ans在更新过程中进行保存,树形dp万变不离其宗啊。。,

    https://www.cnblogs.com/Andromeda-Galaxy/p/10115989.html

    最新回复(0)