問題描述
有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?
解題思路:
這題模型是樹形動態規劃入門題目,
dp[i][0]表示該節點不被選擇,dp[i][1]表示該結點被選擇。
轉移方程為:
dp[u][1]+=dp[v][0];//選擇了u結點,則與它鄰接的結點不選;
dp[u][0]+=max(dp[v][0],dp[v][1]);不選擇u結點,則與它鄰接的結點選擇結果最大的;
應該特別注意:該題結點數量較大,應該選用鄰接表儲存邊的關係
#include#include#define max(a,b) ((a)>(b)?(a):(b))
#define maxn 100010
bool vis[maxn];
int dp[maxn][2];
int father[maxn];
int head[maxn];
int n;
int cnt;
struct edge
edge[2*maxn];
void add(int u,int v)
void treedp(int u) }}
void init()
int main()
{ init();
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&dp[i][1]);
int root=0;
int begin=1;
for(int i=0;i
藍橋杯 演算法訓練 結點選擇
題目 問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一...
藍橋杯 結點選擇 樹形dp
問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...
結點選擇 藍橋杯演算法集
問題描述 有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?輸入格式 第一行包含乙個整數 n 接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。接下來一共 n 1 行,每行描述樹上的一條邊。...