HDU 5534 Partial Tree (完全背包变形)

本文介绍如何解决 HDU 5534 题目,该题要求构造一棵树使其权值和最大。通过将问题转化为完全背包问题并使用动态规划求解,给出了具体的 C++ 实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534

题意:

        给你度为1 ~ n - 1节点的权值,让你构造一棵树,使其权值和最大。

思路:

        一棵树上每个节点的度至少为1,且度的和为2*n - 2。那么我们先给这些节点的度都-1,剩下的节点度为n - 2。此时我们发现,任意分配剩下的这些度给节点,都可以形成一棵树。这就变成了一个完全背包题,容量为n-2。注意dp要初始化为-inf。思路确实巧妙。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 #include <cstring>
 5 using namespace std;
 6 const int N = 2020;
 7 int a[N], inf = 1e8;
 8 int dp[N];
 9 int main()
10 {
11     int t, n;
12     scanf("%d", &t);
13     while(t--) {
14         scanf("%d", &n);
15         for(int i = 1; i <= n - 1; ++i) {
16             scanf("%d", a + i);
17             dp[i] = -inf;
18         }
19         for(int i = 2; i <= n - 1; ++i) {
20             for(int j = 1; j <= n - 2; ++j) {
21                 if(j >= i - 1) {
22                     dp[j] = max(dp[j], dp[j - i + 1] + a[i] - a[1]);
23                 }
24             }
25         }
26         printf("%d\n", dp[n - 2] + n*a[1]);
27     }
28     return 0;
29 }

 

转载于:https://www.cnblogs.com/Recoder/p/5936562.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值