樹形DP入門題目推薦以及解析

2022-03-14 22:28:01 字數 1330 閱讀 7596

今天惡補樹形dp,感覺海星。

其實挺簡單的。

介紹幾道例題,我會的。

1.洛谷p1352 沒有上司的舞會

我的一篇題解

我們可以考慮每乙個節點都是有兩種情況。

乙個是被邀請;另乙個是不會被邀請。

前者後果就是子節點不可以被選擇;

後者結果就是子節點可以被選擇。

於是關係明確,狀態轉移方程為:

dp[root][0] += std::max(dp[son[root][i]][0],dp[son[root][i]][1]);

dp[root][1] += dp[son[root][i]][0];

海星。son[root][i]是當前節點的兒子。

初始化要記得是每乙個點的快樂指數。

#include #include #include #include #include #include #include #include #define max 6050

#define re register

std::vectorson[max];

int n,root,dp[max][2],fa[max];

void dfs(int root)

}void init()

inline void print(int root)

void work()

int main()

2.poj1463 strategic game

我們考慮每乙個節點有兩種情況。

乙個是被選擇;另乙個是不被選擇。

前者的結果是他的子節點可以被選擇,也可以不被選擇;

後者的結果是他的子節點必須備選擇。

所以狀態轉移方程出來了:

dp[root][0] += std::max(dp[son[root][i]][0],dp[son[root][i]][1]);

dp[root][1] += dp[son[root][i]][0];

#include #include #include #include #include #include #include #include #define max 1550

#define re register

int n,dp[max][2],fa[max];

std::vectorson[max];

void dfs(int root)

}void print(int root)

void work()

void init()

work(); }}

int main()

樹形dp題目彙總

1 hdu 1520 anniversary party 每個節點有權值,子節點和父節點不能同時選,問最後能選的最大價值是多少?解題報告 here 2 hdu 2196 computer 經典題,求樹每個點到其他點的最遠距離,轉化為有根樹,深搜兩次,一次記錄到葉子的最遠距離,一次更新最終答案。解題報...

樹形DP入門

hdu1011 一棵樹,有n個結點,每個結點有v個bug,有w的brain。我從1號結點開始走,帶著m個戰士。1個戰士可以消滅20個bugs,如果我把某個結點的所有bug都消滅了我就能得到那個結點的brain。如果想攻擊當前結點,那麼必須先攻擊了它的父結點 1號點除外 其中當你攻占了當前結點,你可以...

樹形dp 入門

以前看過點樹形dp,不過全忘了。今天做了一道入門級的簡單題,回憶了一下。所謂樹形dp就是在一棵樹上進行狀態轉移。有時候他的狀態轉移方程比普通dp還簡單,只不過建圖比較麻煩,順便複習了一下鄰接表的用法,真是好久不練就都忘了。下面是一道最基礎的題,要求父節點和兒子節點不能同時選,求最大權值,很明顯狀態轉...