樹形DP學習筆記

2022-07-11 14:12:11 字數 1782 閱讀 4100

1.為什麼會有樹形dp

正常來說,線性dp用來解決序列的問題,但是當我們維護的資料結構發生變化的時候,比如,現在我們需要對一棵樹

進行dp,普通的線性dp邊無法解決了,這個時候,就需要用到樹形dp了

2.樹形dp的應用場景

1中的應用場景給的比較抽象,這裡詳細的來說一下。最經典的例子就是乙個等級森嚴的公司召開會議,在這個公司裡,

每個人都有乙個對應的上司,而終極大boss老闆則沒有上級。如果乙個人的直接上級(就是相當於他的父節點)出席會議

的話,那他一定不會出席。現在,問你如果有n個人缺席,那麼最多有多少人出席。

即:樹形dp應用於存在依賴關係的資料結構中求最優解的問題。

3.典型例題理解演算法

傳送門題目描述

有一棵蘋果樹,如果樹枝有分叉,一定是分2叉(就是說沒有只有1個兒子的結點)

這棵樹共有n個結點(葉子點或者樹枝分叉點),編號為1-n,樹根編號一定是1。

我們用一根樹枝兩端連線的結點的編號來描述一根樹枝的位置。下面是一顆有4個樹枝的樹

2   5

\ /

3 4

\ /1

現在這顆樹枝條太多了,需要剪枝。但是一些樹枝上長有蘋果。

給定需要保留的樹枝數量,求出最多能留住多少蘋果。

輸入格式

第1行2個數,n和q(1<=q<= n,1n表示樹的結點數,q表示要保留的樹枝數量。接下來n-1行描述樹枝的資訊。

每行3個整數,前兩個是它連線的結點的編號。第3個數是這根樹枝上蘋果的數量。

每根樹枝上的蘋果不超過30000個。

輸出格式

乙個數,最多能留住的蘋果的數量。

輸入輸出樣例

input #1

5 2

1 3 1

1 4 10

2 3 20

3 5 20

output #1

21這道題是乙個典型的入門題,很經典吖。

直接在**裡講啦qwq

看**之前最好先想一下,特別是細節,裡面有幾個地方很容易出錯

碼風還好不用擔心:

1 #include2 #include3 #include4 #include

5 #include6 #include7

#define n 100089

using

namespace

std;

1011

struct

nodeedge[n];

1718

int head[n]=,siz[n]=,cnt_edge=0

,n,q;

19int f[n][n]=;

2021 inline int

read()

2227

while(c>='

0'&&c<='9')

28return num*k;

29}

3031 inline void add_edge(int u,int v,int

val)

3239

40 inline void tdp(int u,int

fa)4154}

55}56}

5758

intmain ()

5967 tdp(1,-1

);68 printf("

%d\n

",f[1

][q]);

69return0;

70 }

view code

樹形DP學習筆記

樹形dp就是.我也不知道是什麼,反正乙個主件下面有很多的附件可選就是樹形dp,咕咕咕 樹形dp的主要實現形式是dfs,在dfs中dp,主要的實現形式是dp i j,i是以i為根的子樹,j是表示在以i為根的子樹中選擇j個子節點,0表示這個節點不選,1表示選擇這個節點。有的時候j或0 1這一維可以壓掉 ...

學習筆記 樹形dp

最近幾天學了一下樹形 dp 其實早就學過了 來提高一下開啟樹形 dp 的姿勢。1 沒有上司的晚會 我的人生第一道樹形 dp 其實就是兩種情況 dp i 1 表示第i個人來時的最大人數 dp i 0 表示第i個人不來時的最大人數 然後遞迴至葉子節點,倒推 dp 狀態轉移方程 dp root 1 dp ...

樹形dp學習

練習專題參考 傳送門 hdu 1520 題意 給出n個點,然後給出n個點對應的歡樂值,然後給出n 1條邊,a b,表示b是a的直屬上級,現在舉行乙個patry,但是要求員工和他的直屬上級不能同時來,問來的人的歡樂值的最大和是多少 思路 首先明確這是一棵有向樹,dp i 0 1 代表第i個人來 不來的...