演算法訓練 結點選擇

2021-09-08 02:39:58 字數 1142 閱讀 9553

問題描述

有一棵 n 個節點的樹,樹上每個節點都有乙個正整數權值。如果乙個點被選擇了,那麼在樹上和它相鄰的點都不能被選擇。求選出的點的權值和最大是多少?

輸入格式

第一行包含乙個整數 n 。

接下來的一行包含 n 個正整數,第 i 個正整數代表點 i 的權值。

接下來一共 n-1 行,每行描述樹上的一條邊。

輸出格式

輸出乙個整數,代表選出的點的權值和的最大值。

樣例輸入 5

1 2 3 4 5

1 21 3

2 42 5

樣例輸出 12

樣例說明

選擇3、4、5號點,權值和為 3+4+5 = 12 。

資料規模與約定

對於20%的資料, n <= 20。

對於50%的資料, n <= 1000。

對於100%的資料, n <= 100000。

權值均為不超過1000的正整數。

問題分析:作為乙個小白,剛拿到這個題目的時候是只想到了樹,但是具體怎麼實現還是一悉莫展,還好藍橋杯**上錦囊的提示和眾多大牛的**以及分析才能勉強寫出ac**。本題是用鏈式前向星的dp來實現的,真正完成後就會發現,其實本題是挺簡單的(至少寫出來了)。

#include#include#includeusing namespace std;

const int maxsize=100010;

int q[maxsize][2];

int head[maxsize];

int k=0;

struct edge

edges[maxsize*2];

void add(int a,int b)

void dfs(int x,int pre)//深度遍歷和動態規劃同步

dfs(to,x);

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

q[x][1]+=q[to][0];

i=edges[i].next;

} /*for(int i=head[x];i!=-1;i=edges[i].next)

*/}int main()

dfs(1,-1);

cout

}

演算法訓練 結點選擇

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

演算法訓練 結點選擇

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

演算法訓練 結點選擇

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