資料結構 樹狀dp

2021-09-27 02:52:48 字數 1458 閱讀 7629

整個公司的人員結構可以看作是一棵標準的多叉樹。樹的頭節點是公司唯一的老闆,除老闆外,每個員工都有唯一的直接上級,葉節點是沒有任何下屬的基層員工,除基層員工外,每個員工都有乙個或多個直接下級,另外每個員工都有乙個快樂值。

這個公司現在要辦 party,你可以決定哪些員工來,哪些員工不來。但是要遵循如下的原則:

1.如果某個員工來了,那麼這個員工的所有直接下級都不能來。

2.派對的整體快樂值是所有到場員工快樂值的累加。

3.你的目標是讓派對的整體快樂值盡量大。

給定一棵多叉樹,請輸出派對的最大快樂值。

輸入描述:

第一行兩個整數 n 和 root,n 表示公司的總人數,root 表示公司的老闆。

接下來 n - 1 行每行兩個整數 u_i 和 v_i 表示 u_i 是 v_i 的直接上級。

輸出描述:

輸出乙個整數表示最大快樂值。
輸入

3 1

5 1 1

1 21 3

輸出

5
備註:

1 ≤ n ≤ 500000
上層dp要用到下層dp,因此應該從下到上的進行dp。

(1)先層序遍歷,儲存每一層的節點。

(2)初始化,最低層。

(3)從下到上進行dp。

#include #include #include #include using namespace std;

//層序遍歷,儲存每一層的節點

void bfs(unordered_map> &mp, int root, vector> &stk)

}stk.push_back(temp); //

}}/*

輸入 3 1

5 1 1

1 21 3

輸出 5

*/int main()

//bfs

vector> stk; //儲存每一層的節點

bfs(mp, root, stk);

//reverse-dfs

vectordp(nums); //快樂值

//初始化stk最低層的快樂值

for(auto s : stk[stk.size()-1])

dp[s] = nums[s];

//從下到上,逐層上公升,計算快樂值

for(int i=stk.size()-2; i>=0; i--) //從下到上,倒數第二層開始

}cout << dp[root];

return 0;

}

資料結構系列( )樹狀結構

樹 是有乙個或乙個以上的節點組成,存在乙個特殊的節點,稱為樹根。每個節點是一些資料和指標組合而成的記錄。除了樹根,其餘節點可分為n 0個互斥的集合,其中每乙個子集合本身也是一種樹狀結構,即此根節點的子樹。此外一棵合法的樹,節點間可以互相連線,但不能形成無出口的迴路。度數 每個節點所有子樹的個數。層數...

資料結構 樹狀陣列

區間資訊的維護與查詢專題 樹狀陣列 1.問題 動態連續和查詢問題。給定乙個n個元素的陣列a1,a2,an,你的任務是設計乙個資料結構,支援以下兩種操作。add x,d 操作 讓ax增加d.query l,r 計算al al 1 ar.對普通陣列進行 一次修改或 特定區間 求和,時間複雜度為o n n...

資料結構 樹狀陣列

原陣列 字首和 範圍和 原陣列更改陣列元素在求和效率較低,引入樹狀陣列 假設原陣列a 樹狀陣列c 樹狀陣列 的三種操作 1.lowbit 子葉數 二進位制最低位的1代表多少 實現 int lowbit int n 求 lowbit x returnx x 2.update a i k 假設a i 是...