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 2output #11 3 1
1 4 10
2 3 20
3 5 20
21這道題是乙個典型的入門題,很經典吖。
直接在**裡講啦qwq
看**之前最好先想一下,特別是細節,裡面有幾個地方很容易出錯
碼風還好不用擔心:
1 #include2 #include3 #include4 #includeview code5 #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 }
樹形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個人來 不來的...