NKOI 1469 通向自由的鑰匙

2021-07-13 07:03:07 字數 1722 閱讀 9019

通向自由的鑰匙

time limit:10000ms  memory limit:65536k

total submit:96 accepted:39 

case time limit:1000ms

description

通向自由的鑰匙被放n個房間裡,這n個房間由n-1條走廊連線。但是每個房間裡都有特別的保護魔法,在它的作用下,我無法通過這個房間,也無法取得其中的鑰匙。雖然我可以通過消耗能量來破壞房間裡的魔法,但是我的能量是有限的。那麼,如果我最先站在1號房間(1號房間的保護魔法依然是有效的,也就是,如果不耗費能量,我無法通過1號房間,也無法取得房間中的鑰匙),如果我擁有的能量為p,我最多能取得多少鑰匙?

input

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

接下來n行,按1~n的順序描述了每個房間。第i+1行包含兩個非負整數cost和keys,分別為第i件房取消魔法需要耗費的能量和房間內鑰匙的數量。 

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

output

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

sample input

5 5

1 21 1

1 12 3

3 41 2

1 32 4

2 5

sample output

7

hint

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

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

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

source

根據題目特徵我們就可以判斷這是一道樹形動規

那麼我們究竟要不要將其轉化為二叉樹呢?

仔細分析:若在i節點上有j點能量,那麼在j>=cost[i]的情況下,我們可以選擇i,也可不選擇i

如果沒有選擇i,那麼i的所有兒子都是選不到的

如果選了i,那麼i的兒子可以選,也可以不選

那麼這個時候就涉及到了對多個兒子的資源分配問題,由於多叉樹的資源分配的討論比較複雜,因此我們可以用二叉樹來簡化狀態

我們用f[x][y]來表示在x節點剩餘y能量所能拿到的最多鑰匙

方程: f[x][y]=max

這個時候在分析一下樣例,我們便能發現在多叉轉二叉的時候又有了一定難度,由於父子關係不明確,轉化出來的二叉樹可能有問題

所以我們在多叉轉二叉的時候用dfs進行轉化,至此,這道題就可以完美解決了

#include#includeusing namespace std;

int n,p,f[105][105],r[105],l[105];

int key[105],cost[105];

bool mark[105],s[105][105];

void dfs(int x)

}void dp(int x)

}int main(){

scanf("%d%d",&n,&p);

int i,x,y;

for(i=1;i<=n;i++)

scanf("%d%d",&cost[i],&key[i]);

for(i=1;i

NKOI 1469 通向自由的鑰匙

p1469通向自由的鑰匙 時間限制 10000 ms 空間限制 65536 kb 問題描述 通向自由的鑰匙被放n個房間裡,這n個房間由n 1條走廊連線。但是每個房間裡都有特別的保護魔法,在它的作用下,我無法通過這個房間,也無法取得其中的鑰匙。雖然我可以通過消耗能量來破壞房間裡的魔法,但是我的能量是有...

NKOI 1469 通向自由的鑰匙

p1469通向自由的鑰匙 時間限制 10000 ms 空間限制 65536 kb 問題描述 通向自由的鑰匙被放n個房間裡,這n個房間由n 1條走廊連線。但是每個房間裡都有特別的保護魔法,在它的作用下,我無法通過這個房間,也無法取得其中的鑰匙。雖然我可以通過消耗能量來破壞房間裡的魔法,但是我的能量是有...

動態規劃 通向自由的鑰匙

通向自由的鑰匙 key.pas c cpp 通向自由的鑰匙被放n個房間裡,這n個房間由n 1 條走廊連線。但是每個房間裡都有 特別的保護魔法,在它的作用下,我無法通過這個房間,也無法取得其中的鑰匙。雖然我可 以通過消耗能量來破壞房間裡的魔法,但是我的能量是有限的。那麼,如果我最先站在 1 號房間 1...