jzoj 3914 人品問題 樹形DP

2021-09-10 04:34:12 字數 1714 閱讀 8346

description

網上出現了一種高科技產品——人品測試器。只要你把你的真實姓名輸入進去,系統將自動輸出你的人品指數。yzx不相信自己的人品為0。經過了許多研究後,yzx得出了乙個更為科學的人品計算方法。這種方法的理論依據是乙個非常重要的結論:人品具有遺傳性。因此,乙個人的人品完全由他的祖先決定。yzx提出的人品計算方法相當簡單,只需要將測試物件的k個祖先的人品指數(可能為負數)加起來即可。選擇哪k個祖先可以由測試者自己決定,但必須要滿足這個要求:如果除自己的父母之外的某個祖先被選了,那麼他的下一代必需要選(不允許跳過某一代選擇更遠的祖先,否則將失去遺傳的意義)。

非常不幸的是,yzx測試了若干次,他的人品值仍然不能為乙個正數。現在yzx需要你幫助他找到選擇祖先的最優方案,使得他的人品值最大。

input

第一行是兩個用空格隔開的正整數n和k,其中n代表yzx已知的家譜中共有多少人(包括yzx本身在內),k的意義參見問題描述。

第二行有n-1個用空格隔開的整數(可能為負),這些數的絕對值在2^15以內。其中,第i個數表示編號為i+1的人的人品值。我們規定,編號為1的人是yzx。

接下來n行每行有兩個用空格隔開的數,其中第i行的兩個數分別表示第i個人的父親和母親的編號。如果某個人的父親或母親不在這個家譜內,則在表示他的父親或母親的編號時用0代替。

除yzx以外的所有人都是yzx的祖先,他們都會作為父親或母親被描述到。每個人都不可能同時作為多個人的父親或者是母親。

output

乙個整數,表示yzx能夠得到的最大人品值。

設d [i

][j]

d[i][j]

d[i][j

]表示編號為i

ii的點選了j

jj個祖先的最大人品值。

我們可以先用dfs統計一下每棵字樹的個數

然後再dp計算。

動態轉移方程為:

b [k

][i]

=max

(b[k

][i]

,b[t

[k].

l][j

]+b[

t[k]

.r][

i−j−

1]);

b[k][i]=max(b[k][i],b[t[k].l][j]+b[t[k].r][i-j-1]);

b[k][i

]=ma

x(b[

k][i

],b[

t[k]

.l][

j]+b

[t[k

].r]

[i−j

−1])

;複雜度o(n

3)

o(n^3)

o(n3

)

#include

#include

#include

#define ll long long

using

namespace std;

struct node t[

110]

;ll n,g,num[

110]

; ll a[

110]

,b[110][

110]

; ll dfs

(ll k)

void

tree

(ll k)

}int

main()

JZOJ3914 人品問題 樹形DP

選擇乙個結點當且僅當選擇他的父親。求選擇m m個結點的最大價值。看到這道題立馬想到方程。很好,o n 3 o n3 肯定會tt飛。看看資料,嗯n 100n 1 00。設f x k 表示在以結點x為根的子數中選擇k個結點的最大價值 那麼當這棵樹沒有子節點時,僅有f x 1 a x 其它全部是inf 當...

樹形dp JZOJ 3914 人品問題

給出一棵樹。乙個節點至多有兩個祖先,如果選了某個祖先,那麼它的後代必須要選乙個。每個點上有乙個權值,求出從1 11號節點取k kk個祖先的最大總權值。很明顯的樹形動態規劃,資料較小,這裡打了o n 3 o n 3 o n3 的做法。設f i j f i j f i j 為第i ii個點選了j jj個...

樹形dp Jzoj P3914 人品問題

description 網上出現了一種高科技產品 人品測試器。只要你把你的真實姓名輸入進去,系統將自動輸出你的人品指數。yzx不相信自己的人品為0。經過了許多研究後,yzx得出了乙個更為科學的人品計算方法。這種方法的理論依據是乙個非常重要的結論 人品具有遺傳性。因此,乙個人的人品完全由他的祖先決定。...