人品問題(樹形dp)

2021-10-05 10:22:47 字數 2465 閱讀 3562

題目描述

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

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

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

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

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

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

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

樣例輸入 copy

6 3

-2 3 -2 3 -1

2 34 5

0 60 0

0 00 0

樣例輸出 copy
4
提示

樣例說明

下圖顯示了輸入資料所描述的家譜圖。括號裡的數表示的是該人的人品值。

4(-2)  5(3)  6(-1)

2(-2)   3(3)

1 <—把兒

顯然,選擇祖先2、3、5能使把兒的人品值達到最大。這個最大值為4

資料規模

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

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

思路:樹形dp。

#pragma comment(linker, "/stack:1024000000,1024000000")

#pragma gcc optimize(3,"ofast","inline")

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;

#define rep(i , a , b) for(register int i=(a);i<=(b);i++)

#define per(i , a , b) for(register int i=(a);i>=(b);i--)

#define ms(s) memset(s, 0, sizeof(s))

#define squ(x) (x)*(x)

#define fi first

#define se second

typedef long long ll;

typedef unsigned long long ull;

typedef pairpi;

typedef unordered_mapun_map;

typedef priority_queueprque;

templateinline void read (t &x)

while (c >= '0' && c <= '9')

x = x * sign;

}const int maxn = 2e5 + 10;

const int inf = 0x3f3f3f3f;

const ll inf = ll(1e18);

const int mod = 998244353;

const double pi = acos(-1);

//#define local

int n,k;

int fa[111][2];

int a[111];

int dp[111][111];

bool vis[111][111];

int dfs(int x,int cnt)

vis[x][cnt]=1;

return dp[x][cnt]=ans;

}int main(int argc, char * ar**)

rep(i,1,n)

int ans = dfs(1,k+1);

printf("%d\n",ans);

return 0;

}

jzoj 3914 人品問題 樹形DP

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

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(人品問題NOIP17提高模擬訓練3)

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