質問の意味:
パーティーを開催する会社があります。、あなたが誰かを招待する場合は、我々は彼の直接の上司に招待されませんが、その人の上司の上司:誰もが彼の直接の上司の制約から自由で楽しい時間を過ごすようにするためには、企業のリーダーが決定しました上司の上司の上司などが招待することができます。誰もが最大の知られている唯一の上司を持っています。
誰もが招待プログラムを求める当事者の数、および大気の最大値のためのパーティーの雰囲気に追加できることを知られている会社。
アイデア:
ツリーDPエントリのタイトル
①最初のセット:配列DP [I] [0]は、私が個人的に喜びの踊りに参加したときのサブツリーの値と
アレイDP [i]が[1]は、私が個人的にサブツリーの喜びと価値のこの踊りに参加しなかったの初めてです
②状態遷移方程式が私であるため、このことから、我々は推測することができます
DP [I] [0] = [I] +Σdp[J] [1](I jが親ノードです)
DP [I] [1] =ΣMax(DP [J] [1]、DP [j] [0]) (I jが親ノードです)
#include <iostreamの> する#include <アルゴリズム> の#include <ベクトル> の#include <CStringの> 使用して 名前空間をSTD。 const int型 MAXN = 6003 ; int型 [MAXN]、DP [MAXN] [ 2 ]。 int型のn; ベクター < INT > エッジ[MAXN]。 ボイド DFS(int型のx、int型FA) { DP [X] [ 0 ] = [X]、DP [X] [ 1 ] = 0 ; 以下のための(int型 I = 0; I <エッジ[X] .size(); I ++ ){ 場合(エッジ[X] [I] =!FA){ DFS(エッジ[X] [i]は、X)。 DP [X] [ 0 ] + = DP [エッジ[X] [I]] [ 1 ]。 DP [X] [ 1 ] + = MAX(DP [エッジ[X] [I] [ 0 ]、DP [エッジ[X] [I]] [ 1 ])。 } } } int型のmain() { 一方(scanf関数(" %のD "、&N)=!EOF){ ため(INT iは= 1 ; I <= N; I ++ ) のscanf(" %dの"、&[I])。 INT 、L、K。 以下のために(INT iが= 1 ; I <= N; I ++ ) エッジ[I] .clear(); memsetの(DP、0、はsizeof (DP))。 一方、(scanf関数(" %D%D "、&L、及びk)&& L && K){ エッジ[L] .push_back(K)。 エッジ[K] .push_back(L)。 } DFS(1、0 ); printf(" %dの\ n "、MAX(DP [ 1 ] [ 0 ]、DP [ 1] [ 1 ]))。 } 戻り 0 。 }