通向自由的鑰匙
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 51 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...