zoukankan      html  css  js  c++  java
  • hdu-6201

    贪心+树形dp

    尽可能低价买入,高价卖出

    设好转移规律就好了

    长记性

    dp[i][1] i号节点或者他的某个子孙中最低买入价格//要靠考虑路费

    dp[i][0] i号节点或者他的某个子孙中最高卖出价格//要考虑路费

    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    typedef long long ll;
    struct Node {
    	int p;
    	ll len;
    	Node(int a, ll b):p(a), len(b) {}
    };
    const int maxn = 2e5 + 7;
    vector<Node>G[maxn];
    int n;
    void add(int x, int y,ll len) {
    	G[x].push_back(Node(y,len));
    }
    ll dp[maxn][4];//1买要小,0卖要大
    ll ans = 0;
    int dfs(int x, int fa) {
    	for (int i = 0; i < G[x].size(); i++) {
    		int p = G[x][i].p;
    		ll ln = G[x][i].len;
    		if (p == fa) continue;
    		dfs(p, x);
    		dp[x][1] = min(dp[x][1], dp[p][1] + ln);
    		dp[x][0] = max(dp[x][0], dp[p][0] - ln);
    	}
    	ans = max(ans, dp[x][0] - dp[x][1]);
    	return 0;
    }
    int main() {
    	int t;
    	scanf("%d", &t);
    	while (t--) {
    		ans = 0;
    		scanf("%d", &n);
    		for (int i = 0; i <= n; i++) {
    			G[i].clear();
    		}
    		int be, en;
    		ll len;
    		for (int i = 1; i <= n; i++) {
    			scanf("%lld", &dp[i][0]);
    			dp[i][1] = dp[i][0];
    		}
    		for (int i = 1; i < n; i++) {
    			scanf("%d%d%lld", &be, &en, &len);
    			add(be, en, len);
    			add(en, be, len);
    		}
    		dfs(1, -1);
    		printf("%lld
    ", ans);
    	}
    	return 0;
    }
    

      

    寻找真正的热爱
  • 相关阅读:
    Mac 如何让python默认运行python3.8
    python发送post请求(转)
    Qt 学习(4)
    自定义Qt组件-通讯模块(P3)
    自定义Qt组件-通讯模块(P2)
    自定义Qt组件-通讯模块(P1)
    用 JS 做一个数独游戏(二)
    用 JS 做一个数独游戏(一)
    公交车情况数问题
    传球问题
  • 原文地址:https://www.cnblogs.com/lesning/p/12452652.html
Copyright © 2011-2022 走看看