codeforces 743D. Chloe and pleasant prizes(树形dp)

题目链接:http://codeforces.com/contest/743/problem/D

大致思路挺简单的就是找到一个父节点然后再找到其两个字节点总值的最大值。

可以设一个dp[x]表示x节点及以下节点能得到的最大值,由于dfs的顺序我们

可以边dfs边求解ans=max(dp[x]+dp[v],ans)(由于dfs是先查询完dp[v]的

左边的树,所以得到的dp[x]是在v节点左边的最大值),顺便记录一下每个节

点的sum值因为一个节点要么整个子树包括自己都要算或者不算。

 

#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
const int M = 2e5 + 10 , inf = 2e14;
typedef long long ll;
ll a[M] , dp[M] , sum[M] , ans;
vector<int>vc[M];
void dfs(int pos , int pre) {
    int len = vc[pos].size();
    ll temp = a[pos];
    for(int i = 0 ; i < len ; i++) {
        int gg = vc[pos][i];
        if(gg != pre) {
            dfs(gg , pos);
            temp += sum[gg];
            if(dp[pos] != -inf) {
                ans = max(ans , dp[pos] + dp[gg]);
            }
            dp[pos] = max(dp[pos] , dp[gg]);
        }
    }
    sum[pos] = temp;;
    dp[pos] = max(dp[pos] , sum[pos]);
}
int main() {
    int n;
    cin >> n;
    for(int i = 1 ; i <= n ; i++) {
        cin >> a[i];
    }
    for(int i = 1 ; i < n ; i++) {
        int x , y;
        cin >> x >> y;
        vc[x].push_back(y);
        vc[y].push_back(x);
    }
    ans = -inf;
    for(int i = 1 ; i <= n ; i++) {
        dp[i] = -inf;
    }
    dfs(1 , -1);
    if(ans == -inf)
        cout << "Impossible" << endl;
    else
        cout << ans << endl;
    return 0;
}

转载于:https://www.cnblogs.com/TnT2333333/p/6210696.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值