演算法訓練 結點選擇 搜尋 動態規劃)

2021-10-20 18:30:30 字數 1169 閱讀 2540

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

第一行包含乙個整數 n 。

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

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

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

51 2 3 4 5

1 21 3

2 42 5

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

資料規模與約定

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

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

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

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

#include

#include

#include

using

namespace std;

const

int max =

1e5+5;

int dp[max][2

];//分為dp[max][0]和dp[max][1]

int visit[max]

;//標記陣列,標記該點是否被訪問過

vector<

int> v[max]

;void

dfs(

int x)

}int

main()

for(

int i =

0; i < n-1;

++i)

dfs(1)

; cout <<

max(dp[1]

[0],dp[1]

[1])

}

題目要求找出權值和最大,可通過狀態轉移方程得出,狀態轉移方程比較難想到

當該i結點要取,則與它相連的j結點不能取,dp[x][1]=dp[x][1]+dp[v[x][i]][0];

當i結點不取的時候,與它相連的j結點可取可不取,dp[x][0]=dp[x][0]+max(dp[v[x][i]][0],dp[v[x][i]][1]);

採用深度搜尋演算法,一條路走到底的形式

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

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

演算法訓練 結點選擇

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

演算法訓練 結點選擇

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