time limit:1000ms memory limit:65536k
total submit:18 accepted:11
description
玩過d ia
bl
odiablo
diablo
的人對技能樹一定是很熟悉的。一顆技能樹的每個結點都是一項技能,要學會這項技能則需要耗費一定的技能點數。只有學會了某一項技能以後,才能繼續學習它的後繼技能。每項技能又有著不同的級別,級別越高效果越好,而技能的公升級也是需要 耗費技能點數的。
有個玩家積攢了一定的技能點數,他想盡可能地利用這些技能點數來達到最好的效果。因此他給所有的級別都打上了分,他認為效果越好的分數也越高。現在他要你幫忙尋找乙個分配技能點數的方案,使得分數總和最高。
input
第一行是乙個整數n(1
<=n
<=20
)n(1<=n<=20)
n(1<=n
<=2
0),表示所有不同技能的總數。接下來依次給出n
nn個不同技能的詳細情況。每個技能描述包括5
55行,第一行是該技能的名稱,第2
22行是該技能在技能樹中父技能的名稱,為空則表示該技能不需要任何的先修技能便能學習。第3行是乙個整數l(1
<=l
<=20
)l(1<=l<=20)
l(1<=l
<=2
0),表示這項技能所能擁有的最高端別。第4
44行共有l
ll個整數,其中第i個整數表示從地i−1
i-1i−
1級公升到第i級所需要的技能點數(0
00級表示沒有學習過)。第5
55行包括l
ll個整數,其中第i
ii個整數表示從第i−1
i-1i−
1級公升級到第i級的效果評分,分數不超過20
2020
。在技能描述之後,共有兩行,第1
11行是乙個整數p
pp,表示目前所擁有的技能點數。接下來1
11行是n
nn個整數,依次表示角色當前習得的技能級別,0
00表示還未學習。這裡不會出現非法情況。
output
s,表示最佳分配方案所得的分數總和。
sample input
3freezing arrow
ice arrow
33 3 3
15 4 6
ice arrow
cold arrow
24 3
10 17
cold arrow
33 3 2
15 5 2
100 0 1
sample output
42解題思路
它雖然是「技能樹」,但是它輸入可能是乙個「技能森林」,
因此,我們需要乙個編號為0的點,作為所有樹的根節點。
int y;
if(ss!="")
yy=findd
(ss)
;else yy=0;
son[yy]
[++son[yy][0
]]=num[i]
;
我們接下來分析如何dp
我們設f[i
][j]
f[i][j]
f[i][j
]表示當前節點用 j
jj 點能量值可獲得的最大值
我們分兩種情況來做:
**
#include
#include
#include
#include
#include
using namespace std;
int son[
1010][
1010
],num[
1010
],l[
1010
],x[
1010][
1010
],y[
1010][
1010
],d[
101000
],f[
1010][
1010
],n,m,tot;
string s[
1010
],ss;
int findd
(string ss)
tot++
; s[tot]
=ss;
return tot;
}void
dp(int dep,int k)
int p=
0,q=0;
for(int j=d[son[dep]
[i]]+1
;j<=l[son[dep]
[i]]
;j++)}
}int main()
scanf
("%d"
,&m)
;for
(int i=
1;i<=n;i++
)scanf
("%d"
,&d[num[i]])
;dp(0
,m);
printf
("%d"
,f[0
][m]);
}
技能樹(樹形dp)
description 玩過diablo的人對技能樹一定是很熟悉的。一顆技能樹的每個結點都是一項技能,要學會這項技能則需要耗費一定的技能點數。只有學會了某一項技能以後,才能繼續學習它的後繼技能。每項技能又有著不同的級別,級別越高效果越好,而技能的公升級也是需要 耗費技能點數的。有個玩家積攢了一定的技...
技能樹 題解
技能樹 玩過d ia bl odiablo diablo 的人對技能樹一定是很熟悉的。一顆技能樹的每個結點都是一項技能,要學會這項技能則需要耗費一定的技能點數。只有學會了某一項技能以後,才能繼續學習它的後繼技能。每項技能又有著不同的級別,級別越高效果越好,而技能的公升級也是需要 耗費技能點數的。有個...
狀態壓縮DP 樹形D
動態規劃的狀態有時候比較難,不容易表示出來,需要用一些編碼技術,把狀態壓縮的用簡單的方式表示出來。典型方式 當需要表示乙個集合有哪些元素時,往往利用2進製用乙個整數表示。一般有個資料 n 16 或者 n 32 這個很可能就是狀態dp的標誌,因為我們要用乙個int的二進位制來表示這些狀態。要注意好這些...