POJ2342-周年party-(木DP)

http://poj.org/problem?id=2342

質問の意味:パーティーに、そこの従業員を、N、N- 1をされている従属関係にあっても木のように、各従業員が幸せな値が負になることができている、従業員のパーティーならば、彼は直接の上司に行くことができませんパーティーで人、総幸福の最大数の究極の値を求める当事者。

溶液:DP DFSた[0]プラスパーティ、サブツリーのルートノードの最大値、すなわち、Y DPのすべての息子[Y]からx [1] [x]はツリーのルートを見つけます直接部下彼は参加できない場合はアップ、参加をX; DPは、[X] [0]×パーティを見送る、その後、彼は直接レポートを行くことができない、彼の息子最大蓄積状態を表し、すなわち、最大(DP [Y] [0]、DP [Y] [1]);参加息子幸せ考慮しない場合は0よりも大きい場合、0は、MAX [0] DP [x]は[0]ないように、DPう[Y]を取る未満でありますこれは、ゼロよりも少なくなります。

書式#include <stdio.hに> 
する#include <iostreamの> 
の#include <アルゴリズム> 
書式#include <CStringの> 
書式#include <math.h>の
書式#include < 文字列 > 
の#include <マップ> 
書式#include <キュー> 
の#include <スタック> 
#含ま < 設定 >
 の#defineは長い長いっ
 の#define 0x3f3f3f3f INF
 使用して 名前空間はstdを、

int型のn; 
ベクトル < 整数 >息子[ 6005 ];
INT DP [ 6005 ] [ 2 ]。
BOOL VIS [ 6005 ]; 

ボイド DFS(int型X)
{ 
    ためint型 i = 0 ; I <息子[X] .size(); iは++ 
    { 
        int型、Y = 息子[X] [I]; 
        DFS(Y)。
        DP [X] [ 0 ] + = MAX(DP [Y] [ 1 ]、DP [Y] [ 0 ])。
        DP [X] [ 1 ] + = DP [Y] [ 0 ]。
    } 
} 

int型のmain()
{ 
    一方(scanf関数(" %のD "、&​​N)!= EOF)
    { 
        memsetの(DP、0はsizeof (DP)); 
        のmemset(VIS、falseにはsizeof (VIS));
         のためのINT I = 1 ; I <= N; I ++の
            scanfの(" %Dを"&DP [I] [ 1。)]; /// 初期DP [i]は[1]私はパーティに幸福値を表す
        整数K、L;
         のためint型 iは= 1 ; iがN- <I ++は
        { 
            scanfの(" %のD%のD "、&​​L、&K ); 
            息子[K] .push_back(L); 
            VIS [L] = ; /// Uは上司有
        } 
        のscanf(" %dの%のD "、&​​L、&k)を、
        int型 iは= 1 ; iが<= N; iが++ 
        { 
            場合(!//找到根节点VIS [I])
            { 
                DFS(I)。
                printf(" %Dを\ n "、MAX(DP [I] [ 0 ]、DP [I] [ 1 ]))。
                破ります; 
            } 
        } 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/shoulinniao/p/11432785.html