ツリー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 ])。 }