1. 程式人生 > 實用技巧 >hdu6725(樹形dp,區間選值,點權差最大)

hdu6725(樹形dp,區間選值,點權差最大)

題:http://acm.hdu.edu.cn/showproblem.php?pid=6725

分析:給節點選值肯定是選邊界值。假設由節點是選中間值,那麼肯定有比它選值更好的值,所以把選的可能定為2個。

#include<bits/stdc++.h>
using namespace std;
#define pb push_back
#define MP make_pair
typedef long long ll;
typedef unsigned long long ull;
const int mod=998244353;
const int inf=0x3f3f3f3f;
const
int M=1e5+5; ll l[M],r[M]; ll dp[M][2]; vector<int>g[M]; void dfs(int u,int fa){ for(auto v:g[u]){ if(v!=fa){ dfs(v,u); dp[u][0]+=max(dp[v][0]+abs(l[v]-l[u]),dp[v][1]+abs(r[v]-l[u])); dp[u][1]+=max(dp[v][0]+abs(l[v]-r[u]),dp[v][1]+abs(r[v]-r[u])); } } }
int main(){ int t; scanf("%d",&t); while(t--){ int n; scanf("%d",&n); for(int i=1;i<=n;i++) dp[i][0]=dp[i][1]=0,g[i].clear(); for(int u,v,i=1;i<n;i++){ scanf("%d%d",&u,&v); g[u].pb(v); g[v].pb(u); }
for(int i=1;i<=n;i++) scanf("%lld%lld",&l[i],&r[i]); dfs(1,0); printf("%lld\n",max(dp[1][0],dp[1][1])); } return 0; }
View Code