hdu 1520 樹形DP基礎

2022-09-17 23:48:13 字數 1325 閱讀 7160

父節點和子節點不能同時選。

首先是建樹,這個在之前的樹形揹包裡有講:

因為這裡沒有指定根節點,所以可以建雙向邊,這樣就可以從任乙個點出發遍歷

接下來是dp,狀態轉移方程:

dp[fa][0] += max(dp[son][0]+dp[son][1])

dp[fa][1] += dp[son][0]

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define mem(a,b) memset(a,b,sizeof(a))

#define pf printf

#define sf scanf

#define spf sprintf

#define pb push_back

#define debug printf("!\n")

#define maxn 20000+5

#define max(a,b) a>b?a:b

#define blank pf("\n")

#define ll long long

#define all(x) x.begin(),x.end()

#define ins(x) inserter(x,x.begin())

#define pqueue priority_queue

#define inf 0x3f3f3f3f

#define ls (rt<<1)

#define rs (rt<<1|1)

intn,m;

int ptr = 1,head[maxn],a[maxn],dp[maxn][2

],vis[maxn];

struct

node

tree[maxn];

void add(int fa,int

son)

void dfs(int

root)

}int

main()

dfs(1);

pf("%d\n

",max(dp[1][0],dp[1][1

]));

}return0;

}

HDU 1520 簡單樹形dp

題意 乙個大學要舉行職工party。為使party中每個人都玩的開心,直接上司和下屬關係的員工不能同時參加。每個人都有各自的歡樂值。問如何邀請使得總歡樂值最大。dp i 1 表示選擇i點 dp i 0 表示不選擇i點 include include include include using nam...

HDU1520 樹形dp入門)

解題思路 設dp i 0 表示 當前這個點不選,dp i 1 表示當前這個點選擇的最優解。轉移方程 dp cur 0 max dp son 1 dp son 0 當前這個點不選,那他的孩子可選可不選,取 最大的。dp cur 1 dp son 0 當前這點選擇,那他的孩子就不能選擇。include ...

hdu1520樹形dp入門

題目鏈結 題意 要開派對,邀請了上司就不能邀請他的下屬,邀請了下屬就不能邀請他的上司,每個人有乙個值,求邀請的人的總值最大 第一行給出乙個數n,代表有n個人。下面n行分別給出n個人的的值 再下面n行每行給出l,k k是l的上司 以0 0結束一組輸入 樹形dp 把每個人看成乙個點,則該點有兩個狀態 邀...