技能樹 difficult 樹形DP

2021-10-09 06:21:56 字數 2763 閱讀 6610

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的二進位制來表示這些狀態。要注意好這些...