hdoj1520(エントリーツリーDP)

トピックリンクします。https://vjudge.net/problem/HDU-1520

質問の意味:その道路と同じタイトルのいないパーティーボスは、木の少し右を与えluogu、親ノードと子ノードは、重量と最大で、あなたは最高を求めることができるように選択した方法を聞いて、選択することはできません。

アイデア:肝臓は最近QAQは、来る開始するために基本的な質問から、木のDPを開始しました!

   DPで[U] [0] Uは、ノードが選択されていない、DP [U]を表す[1]が選択される基を表し、VIは、次いで、ノードuの子ノードです。

    DP [U] [0] = SUM(MAX(DP [我々] [0]、DP [我々] [1]))

    DP [U] [1] = valの[U] + SUM(DP [VI] [0])

   一度OK DFS、結果が最大(DP [ルート] [0]、DP [ルート] [1])、自分の道をルートです。

ACコード:

書式#include <cstdioを> 
する#include <アルゴリズム>
 使用して 名前空間はstdを、

const  int型 MAXN = 6005 ;
int型 N、CNT、ヘッド[MAXN]、ヴァル[MAXN]、indeg [MAXN]、DP [MAXN] [ 2 ]。
構造体ノード{
     int型V、NEX。
}エッジ[MAXN]。

ボイド ADDE(INT U、INT V){ 
    エッジ[ ++ CNT] .V = V。
    エッジ[CNT] .nex = 頭部[U]。
    ヘッド[U] = CNT。
} 

ボイド DFS(INT U){ 
    DP [U] [ 1 ] =ヴァル[U]。
    以下のためにint型 ; I I = I =ヘッド[U] {エッジ[I] .nex)
         のint V = エッジ[I] .V。
        DFS(V); 
        DP [U] [ 0 ] + = MAX(DP [V] [ 0 ]、DP [V] [ 1 ])。
        DP [U] [ 1 ] + = DP [V] [ 0 ]。
    } 
} 

int型のmain(){
     ながら(〜のscanf(" %d個"、&N)){ 
        CNT = 0 以下のためにint型私= 1 ; iが<= N; ++ I){ 
            scanf関数(" %のD "、およびヴァル[I])。
            ヘッド[I] = 0、indeg [I] = 0、DP [i]が[ 0 ] = 0 
        } 
        int型、B。
        一方、(scanf関数(" %D%dの"、&​​、&B)、&& B){ 
            indeg [A] = 1 
            ADDE(B、A)。
        } 
        int型のルート;
        以下のためにint型 I = 1 ; I <= N; ++ I)の
             場合(!indeg [I]){ 
                ルート =私;
                破ります; 
            } 
        DFS(ルート)。
        printf(" %Dを\ n "、MAX(DP [ルート] [ 0 ]、DP [ルート] [ 1 ]))。
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/FrankChen831X/p/11372594.html