(木DPエントリーのタイトル)周年記念パーティー(無パーティのボス)HDU - 1520

質問の意味:

パーティーを開催する会社があります。、あなたが誰かを招待する場合は、我々は彼の直接の上司に招待されませんが、その人の上司の上司:誰もが彼の直接の上司の制約から自由で楽しい時間を過ごすようにするためには、企業のリーダーが決定しました上司の上司の上司などが招待することができます。誰もが最大の知られている唯一の上司を持っています。 
誰もが招待プログラムを求める当事者の数、および大気の最大値のためのパーティーの雰囲気に追加できることを知られている会社。

アイデア:

ツリー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(10 ); 
        printf(" %dの\ n "、MAX(DP [ 1 ] [ 0 ]、DP [ 1] [ 1 ]))。
     } 
    戻り 0 
 }

おすすめ

転載: www.cnblogs.com/overrate-wsj/p/12171553.html