题目如下:
输入样例:
5
1 -2 -3 4 5
4 2
3 1
1 2
2 5
输出样例:
8
题解 or 思路:
这是一道很经典的树形DP问题
我们用递归的思想去求解
d
p
[
x
]
dp[x]
dp[x] 是以
x
x
x(一定包含
x
x
x 节点) 节点开始可以得到的最大评分
d
p
[
x
]
+
=
m
a
x
(
0
,
d
p
[
i
t
]
)
dp[x] += max(0, dp[it])
dp[x]+=max(0,dp[it]),
i
t
it
it 是
x
x
x 的子节点
通过递归去进行dp,也就是树形dp了
具体请参考代码
AC 代码如下:
#define buff \
ios::sync_with_stdio(false); \
cin.tie(0);
#define ll long long
const int N = 100009;
int n, val[N];
ll dp[N];
vector<int> g[N];
void dfs(int x, int fa)
{
dp[x] = val[x];
for (auto it : g[x])
{
if (it != fa)
{
dfs(it, x);
if (dp[it] > 0)
dp[x] += dp[it];
}
}
}
void solve()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> val[i];
for (int i = 1; i < n; i++)
{
int a, b; cin >> a >> b;
g[a].push_back(b), g[b].push_back(a);
}
dfs(1, -1);
ll ans = dp[1];
for (int i = 2; i <= n; i++)
ans = max(ans, dp[i]);
cout << ans << '\n';
}
int main()
{
buff;
solve();
}