羅バレーコースP2014 - 木DP

ツリーDP、リンクテーブルメモリツリー、現在のサブノードiと表記前提条件ルート、金点Xの第一層の子ノード、および金X X合計サブツリーの第二の層とは見なされない息子点Jで示される、選択し、家族やkで表さ金X X合計選択されたサブツリーの第3の層の数は、それは私が点xサブiにおける除い支店最適解プラスxで選択された最適解JKどのように多くの家族です即ち、木の枝を選択したツリーサブ最適解K以外: 

        DP [X] [J] =最大{DP [X] [J]、DP [I] [JK] + DP [X] [K]

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
構造体cyka {
     int型プリ、であり; 
} E [ 1000000 ]。
int型 [F CNT、1000 ]、[ 1000 ]、ヘッド[ 100000 ]、N、M。
ボイド追加(INT  からINTに){                 // 链接表 
    E [++ CNT] .PRE =ヘッド【から]。
    E [CNT] .TO = であり; 
    【ヘッドから =] CNT。
} 
ボイド DP(INT X){ // 当前点
    int型 {; I I = E [I] .PRE I =ヘッド[X])       // サブドットの片
        INT Y = E [I] .TO; 
        DP(Y);        // 可動典子ポイント
        のためにINT J = M + 1、J> 0 ; J - ){           // 被験者数xの選択の開始から片
            用のint型 K = 1 ; K <= J、K ++){    // 対象Iの選択の先頭から個数 
                F [X] [J] = MAX(F [X] [J]、F [Y] [JK] + F [X] [K]);   // 状態遷移式
            } 
        } 
    } 
} 
int型のmain() { 
    scanfの(" %Dの%のD "、&​​N、&M)。
    int型 iは= 1 ; iが<= N iが++ ){
         int型のX; 
        scanf関数(" %のD "、&x)は、
        CIN >> F [i]が[ 1 ]。
        (X、i)を追加します。
    } 
    DP(0 )。
    printf(" %d個の\ n "、[F 0 ] [M + 1 ])。
}

 

おすすめ

転載: www.cnblogs.com/passione-123456/p/11198795.html