今天惡補樹形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還簡單,只不過建圖比較麻煩,順便複習了一下鄰接表的用法,真是好久不練就都忘了。下面是一道最基礎的題,要求父節點和兒子節點不能同時選,求最大權值,很明顯狀態轉...