首页 > 代码库 > HDU 5534 Partial Tree (完全背包变形)

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

题目链接: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 }

 

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