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得出了乙個更為科學的人品計算方法。這種方法的理論依據是乙個非常重要的結論 人品具有遺傳性。因此,乙個人的人品完全由他的祖先決定。...