結點選擇(樹形動態規劃)

2021-07-27 00:16:50 字數 1164 閱讀 8559

現在對於樹形動態規劃理解的還不是很透徹,只能先做幾個題目練習一下

本題很重要的兩個方面乙個是建樹,這個需要邊和點的相互配合,乙個點兩條邊的表示都要標記。

第二個很重要的方面是動態規劃的變化,

本題首先想到的一成一成的樹,要不是子集的結合,要不就是自己本身,上乙個點要不是自己本身,要不是自己和子節點的子節點的結合的結合這個這個點的兩個值的問題。

這需要樹來實現,如何構建樹成為乙個大問題;

那麼邊需要編號,而且邊是雙向的,所以就出現頭和尾巴不一樣的情景。

分別對邊編號標記。

#include #include #include using namespace std;

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

#define maxx 100010

int dp[maxx][2];//0和1分別放置本身的價值和子節點的價值

int head[maxx];//表示節點所連線的邊

struct note

edge[maxx*2];

int m;//邊序號

void add(int from,int to)

void dfs(int x,int pre)

int to=edge[i].to;

dfs(to,x);

dp[x][0]+=max(dp[to][1],dp[to][0]);

dp[x][1]+=dp[to][0]; }}

int main()

for(int i=1;i<=n-1;i++)

dfs(1,0);

int res=max(dp[1][0],dp[1][1]);

printf("%d",res);

return 0;

}

動態規劃 樹形動態規劃 結點選擇

題目 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。輸出乙個整數,...

演算法訓練 結點選擇 樹形動態規劃

問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...

結點選擇 (藍橋杯 樹形動態規劃)

問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...