羅区[] P3177 [HAOI2015]ツリー着色

問題の表面をコピーするのが面倒ポータルに直接、右

分析

  ポイントと聞いても感じていないの地点間の直線距離を探しているので、私たちは発見するための方法を検討してください。

  問題の解決策を一瞥

  関連の頂上からのパスの長さによって、私たちはそれのそれぞれの側の直接的な貢献を見て(このああを考えているだろう)

  各エッジに対して、その寄与は、に等しい(白ドットの反対側に白ドットの側* + *ながら黒点の反対側にブラックドットの数)*右側

  その後。私は立ち往生しました。再び問題への解決策を目指して

  任意のサブツリーのために、ちょうどサブツリーと黒点の数の大きさは、我々は、サブツリーの外側エッジに接続される部分の寄与を計算することができることを知っています

  そう直接DP [i] [j]は黒ノード回答に対する最大の寄与を有するIのサブツリーのルートノードjを表し、そして次にバックパックのようなツリーを導きます。

  列挙状態が時に無意味ではない状態(この時点曲私に半日)列挙することに注意してください

  コード(圧力ラインが信仰です)

書式#include <cstdioを> 
する#include <アルゴリズム>
 使用して 名前空間はstdを、
const  int型 MAXN = 2005 ;
長い 長いDP [MAXN] [MAXN]。
INTの N、K、ECNT、インフォ[MAXN]、SIZ [MAXN]、INP [MAXN]、NX [MAXN * 2 ]、V [MAXN * 2 ]、W [MAXN * 2 ]。
ボイド追加(INT U1、INT V1、INT W1){NX [++ ECNT =インフォ[U1];インフォ[U1] = ECNT; V [ECNT = v1の; [ECNT = WをW1;}
 ボイド DFS(int型のx、int型のF)
{
    SIZ [X] = 1 以下のためにint型 ; I; I =情報[X] I = NX [i])とあれば(!Vを[I] = F)
    {
        INP [V [I] = W [i]は、DFS(V [i]は、x)は、SIZ [X] + = SIZ [V [I]]。
        INT ; J> = J =分(SIZ [X]、K)0 ; j-- のためのint型のk = 0 ; kは++; <= SIZ [V [i]は<= J && K kは場合(JK <= SIZ [X] -siz [V [I])DP [X] [J] = MAX(DP [X] [J]、DP [X] [JK] + DP [V [I] [K ]);
    }
    以下のためにint型 i = 0 ; I <= SIZ [X] && iは= Kを<; iは++ 
    DP [X] [i]を + = 1LL *(1LL * i *が(KI)+ 1LL *(SIZ [X] -i)*(NK-SIZ [X] + I))* INP [X]。
}
int型のmain()
{
    scanf関数(" %d個の%のD "、&​​N&K)。
    int型 I = 1、U1、V1、W1、iがn <; iは++ 
    scanf関数(" %D%D%D "、&​​U1、&V1、&W1)、追加(U1、V1を、W1)、(W1、V1、U1)を加えます。
    DFS(10);のprintf(" %LLDする\ n "、DP [ 1 ] [K])。
}

 

おすすめ

転載: www.cnblogs.com/firecrazy/p/11628502.html