木のDPボード。
ポータル:GO
Jは、私はDP [I] [J]で最もお金(古典的なモデル)を獲得するサブツリーを選択し、観客を表します。
次いで、DP [I] [J + K] = MAX(DP [息子[I] [K] + DP [I] [j]は-w、DP [I] [J + K])は、平均値、選択されたサブツリーのk個の観客ならば、答えは( - このセクションのコスト現在、Kのみの観客の場合には、状況のJ +選択されたサブツリーを選択しました)です。
速報値、訪問者の量すべての選択は、現在のサブツリーは観客の量が含まれているので、観客の量に含まれるタイプのサブツリーを返すように設計されたDFSは、上部の列挙バインドを処理することができます:上限列挙が何を決定します。
ノードuのため、Uプレフィックスが外層列挙上のすべてのサブツリー(必要な動的更新を)制限され、現在のサブツリーの内側サイズに制限されます。
アカウントに伝達方程式の聴衆を取ると、観客は少なくよりから、それは余計な原因には影響しません、衝撃のあまりを持っているので、逆列挙します。
コードの残りの部分を参照してください。
1つの#include <ビット/ STDC ++ H> 2 使用して 名前空間STDを、 3 int型リード(){ 4 int型のx = 0、F = 1 。 5 チャー C = GETCHAR()。 6 ながら(!isdigit(c)参照){ 7 場合(C == ' - ')、F = - 1 。 8 C = GETCHAR()。 9 } 10 ながら(isdigit(C)){ 11 、X = X * 10 + C- ' 0 ' 。 12 C = GETCHAR()。 13 } 14 リターンのx *のF。 15 } 16 のconst int型 N = 3010 。 17 int型N、M、CNT。 18 int型ヘッド[N << 1 ]。 19 INT 月[N]、[N] [N] F。 20 構造体端{ INT次に、W;} E [N << 1 ]。 21 ボイド addedge(INT から、INTに、INT W){E [++ CNT] =(エッジ){に、[先頭から ]、W};頭[] = CNT;} 22 INT DFS(INT U){ 23 であれば(U> N- M){ 24 F [U] [ 1 ] = 月[U]。 25 リターン 1 。 26 } 27 のint UPZ = 0 。 28 のために(int型 I =ヘッド[U]; I; I = E [I] .next){ 29 のint V = E [i]の.TO、W = E [I] .W。 30 INTは今= DFS(V)。 31 のために(INT J = UPZあり、j> = 0 ; j-- ){ 32 のための(int型のk = 0 ; K <=今++ kは{) 33 F [U] [J + K] = MAX(F [U] [J + K]、F [U] [J] + F [V ] [K] - W)。 34 } 35 } 36 UPZ + = 今。 37 } 38 リターンUPZ。 39 } 40 INT メイン(){ 41 N =読み取る(); M = 読み取ります()。 42 のためには、(int型 I = 1、kは、iが<= NM; iは++ ){ 43 、K = リード()。 44 のために(INTの J = 1 ; J <= K; J ++ ){ 45 INTは、X =リード()、yは。= 読み取ります(); 46 addedge(I、x、y)は、 47 } 48 } 49 のための(int型 I = N-M + 1 ; iが<= N; I ++)は月[I] = (読み取り) 50 のmemset(F、 - 0x3fを、はsizeof (F))。 51 のためには、(int型 i = 1 ; iがn = <; iは++)F [i]が[ 0 ] = 0 ; 52の DFS(1 )。 53 のための(int型I = M、I> 0 ; i-- ){ 54 であれば([F 1 ] [I]> = 0 ){ 55 のprintf(" %dの" 、I)。 56 リターン 0 。 57 } 58 } 59 リターン 0 。 60 }