父節點和子節點不能同時選。
首先是建樹,這個在之前的樹形揹包裡有講:
因為這裡沒有指定根節點,所以可以建雙向邊,這樣就可以從任乙個點出發遍歷
接下來是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 把每個人看成乙個點,則該點有兩個狀態 邀...