題解 樹形dp NKOI1469 通向未來的鑰匙

2021-08-02 22:16:08 字數 1508 閱讀 7466

水一發水一發 題解

** 通向自由的鑰匙被放 n 個房間裡,這 n 個房間由 n-1 條走廊連線。但是每個房間裡都有

特別的保護魔法,在它的作用下,我無法通過這個房間,也無法取得其中的鑰匙。雖然我可

以通過消耗能量來破壞房間裡的魔法,但是我的能量是有限的。那麼,如果我最先站在 1

號房間(1 號房間的保護魔法依然是有效的,也就是,如果不耗費能量,我無法通過 1 號房

間,也無法取得房間中的鑰匙),如果我擁有的能量為 p,我最多能取得多少鑰匙?

第一行包含兩個非負整數,第乙個為 n,第二個為 p。

接下來 n 行,按 1~n 的順序描述了每個房間。第 i+1 行包含兩個非負整數 cost 和 keys,

分別為第 i 件房取消魔法需要耗費的能量和房間內鑰匙的數量。

接下來 n-1 行,每行兩個非負整數 x,y,表示 x 號房間和 y 號是連通的。

一行乙個整數,表示取得鑰匙的最大值。

輸入:key.in

5 5

1 2

1 1

1 1

2 3

3 4

1 2

1 3

2 4

2 5

輸出: key.out

7對於 20%的測試資料,有 n<=20

對於 30%的測試資料,有 n<=30

對於所有測試資料,有 p,n<=100, cost <= maxint, keys<= maxint

n個點(n-1)條邊

顯然建樹。

題目可看作簡單的樹上揹包,多叉轉二叉後

有p塊錢,分配給兒子和兄弟錢數,求最大獲利即可

只是需要稍微提一下到建樹方式 我才不會說我主要除錯這裡去了

又沒說給出的x,y中前面的就是父親,後面就是兒子

需要先記錄點與點之間的聯通,之後掃一遍,掃到的兒子遞迴處理即可

就是樹形dp模板題,調了一下午

老年oi選手要退役了

#include 

#include

const

int maxn = 110;

int cost[maxn], keys[maxn];

int son[maxn], bro[maxn];

int dp[maxn][maxn];

bool vis[maxn];

int n;

inline

void swap(int &a, int &b)

void line(int rt)

}}int f(int rt, int pw)

return dp[rt][pw] = res;

}int main ()

line(1);

memset(dp, -1, sizeof(dp));

printf ("%d", f(1, p));

return

0;}

題解 hdu2196 樹形DP

題目鏈結 分析 求乙個樹中所有節點能到達的最遠距離f i 要用兩個dfs。首先第乙個dfs求出所有每個節點i在其子樹中的正向最大距離和正向次大距離和dist i 0 和dist i 1 如果i節點在子樹中最大距離經過了2號兒子,那麼次大距離就是不經過2號兒子的最大距離 並且還要標記longest i...

題解 poj1947 樹形DP

題目鏈結 dp root j 以root為根節點的子樹,得到 j 個節點的子樹需要最少減掉的邊數,注意子樹中必須保留root節點。否則無法dp 那麼很明顯的邊界條件dp root 1 num 兒子的個數 因為要只剩乙個節點的子樹,那麼所有的孩子都減掉,這樣就為兒子的個數。那麼狀態轉移方程呢 dp r...

筆記 題解 樹形DP lgP4084

一眼看過去是給定幾個限制求方案數,那麼肯定聯想到 dp 而且給出的是樹形結構,那麼就是一道樹形 dp 的題。那麼先來總結一下樹形 dp 的一般規律,首先關於狀態轉移方程,一般是設 dp i j 表示的是以 i 為根的子樹,有 j 或者更多的限制就用多維陣列。那麼如何求解呢?一般考慮兩種思路 1.先把...