水一發水一發 題解
** 通向自由的鑰匙被放 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.先把...