樹形dp(人品問題NOIP17提高模擬訓練3)

2021-08-04 11:13:01 字數 1266 閱讀 4842

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

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

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

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

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

輸入資料中除把兒以外的所有人都是把兒的祖先,他們都會在輸入資料中作為父親或母親被描述到。輸入資料中每個人都不可能同時作為多個人的父親或者是母親。

將把兒能夠得到的最大人品值輸出

6 3

-2 3 -2 3 -1

2 34 5

0 60 0

0 00 0

4

對於50%的資料,n<=10;

對於100%的資料,n<=100。

因為乙個節點擊了之後,所有與他到根節點上面的點都要被選,並且題目告訴你了構造的這棵樹是二叉樹,於是就很自然的想到樹形dp(我沒有學過,但是我也不知道我是怎麼弄出來的)。

我寫非dfs形式發現非常的難寫,於是看了網上的其他的大佬的部落格,發現竟然可以用dfs的遞迴形式加上剪枝就是dp了,orz。

#include#define maxn 200

#define inf 2014020

using namespace std;

int n,k;

int dp[maxn][maxn];

bool book[maxn][maxn];

struct pointp[maxn];

int dfs(int now,int sum)

人品問題(樹形dp)

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

樹形dp(數字轉換NOIP17提高模擬訓練4)

如果乙個數x的約數和 不包括它本身,下同 比它本身小,那麼x可以變成它的約數和 如果對於某個y x且y的約數和為x,那麼x也可以變成y。例如,4可以變為3,1可以變為7。限定所有的數字變換在不超過n的正整數範圍內進行,求不斷進行數字變換且沒有重複數字出現的最多變換步數。輸入乙個正整數n。輸出最少需要...

jzoj 3914 人品問題 樹形DP

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