hdu-6201

+ Arbre Greedy dp

Dans la mesure du possible acheter bas, vendre haut

Définir une bonne règle de transfert très bien

La mémoire à long

dp [i] [1] numéro i nœud ou un de ses fils l'examen le plus bas du prix d'achat // compter sur les péages

dp [i] [0] noeud i numéro ou un de ses fils le plus haut prix de vente à être considéré comme sans //

#include <iostream> 
#include <cstring> 
#include <algorithme> 
#include <vector> 
using namespace std; 
typedef long long ll; 
struct Node { 
	int p; 
	ll len; 
	Noeud (int a, ll b): p (a), len (b) {} 
}; 
const int maxn = 2e5 + 7; 
vector <Node> G [maxn]; 
int n; 
vide add (int x, int y, ll len) { 
	G [x] .push_back (Node (y, x)); 
} 
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; 
		si (p == fa) de continuer; 
		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 (dp ans, [x] [0] - dp [x] [1]); 
	return 0; 
} 
Int main () { 
	int t; 
	scanf ( "% d", et t); 
	tandis que (t--) { 
		ans = 0; 
		scanf ( "% d", et n); 
		pour (int i = 0; i <= n; i ++) { 
			G [i] .clear (); 
		} 
		Int être, en; 
		ll len; 
		pour (int i = 1; i <= n; i ++) { 
			scanf ( "% lld", et dp [i] [0]); 
			dp [i] [1] = dp [i] [0]; 
		} 
		For (int i = 1; i <n; i ++) { 
			scanf ( "% d% d% lld", et être, et en, et LEN); 
			ajouter (être, en, len); 
			ajouter (en, être, seulement); 
		}
		dfs (1, -1); 
		printf ( "% lld \ n", ans); 
	}
	return 0; 
}

  

Je suppose que tu aimes

Origine www.cnblogs.com/lesning/p/12452652.html
conseillé
Classement