題意:給定一棵樹,每個點有權值,對於每乙個點,它和它的父節點不能同時被選,求權值最大值。 定義d
p[x]
[0] dp[
x][0
]表示不選擇x號點時的最大值,dp
[x][
1]d p[
x][1
]表示選擇
x x
號點時的最大值。 對於x
' role="presentation" style="position: relative;">x
x號點不被選擇的情況,也就意味著它的子節點
v v
可以被選,也可以不被選,所以方程就是:
dp[x][0]+=max(dp[v][1],dp[v][0]);
對於
x' role="presentation" style="position: relative;">x
x號點被選擇的情況,它的子節點
v v
不可以被選,所以方程就是
dp[x][1]+=dp[v][0];
我們從根節點開始dfs,從葉節點開始累加,最後在dp
[roo
t][1
]和dp
[roo
t][0
]' role="presentation" style="position: relative;">dp[
root
][1]
和dp[
root
][0]
dp[r
oot]
[1]和
dp[r
oot]
[0]中取乙個最大值即可
#include
#include
#include
using
namespace
std;
int dp[1001000][2],f[1001000];
int n,num,head[1001000];
struct node
e[1001000];
void add(int from,int to)
void dfs(int x)
return;
}int main()
int z,ze;
cin>>z>>ze;
int root;
for(int i=1;i<=n;++i)
if(f[i]==0)
dfs(root);
int ans=max(dp[root][1],dp[root][0]);
cout
0;}
樹形DP 沒有上司的舞會
ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 hi 給出,其中 1 i n。現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快...
沒有上司的舞會 樹形DP
ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 hi 給出,其中 1 i n。現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快...
沒有上司的舞會(樹形dp)
ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 hi 給出,其中 1 i n。現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,使得所有參會職員的快...