H - Partial Tree HDU - 5534 (背包)
题目链接:
H - Partial Tree
题目大意:首先是T组测试样例,然后n个点,然后给你度数分别为(1~n-1)对应的不同的权值,然后问你在这些点形成树的前提下的所能形成的最大权值。
具体思路:
这个题是学长做的,我记录一下思路。
有点背包的感觉,但是和之前我做过的有点不同,原来的背包是互相不会影响的。但是对于这个题,我们需要的前提是形成一棵树,所以为了解决这个问题,我们先给每个点分配一个度,然后再去把剩余的n-2的度再分配下去就可以了。
AC代码:
1 #include<bits/stdc++.h>
2 using namespace std;
3 # define ll long long
4 # define inf 0x3f3f3f3f
5 const int maxn = 2e5+100;
6 ll dp[maxn];
7 ll a[maxn];
8 int main()
9 {
10 int T;
11 scanf("%d",&T);
12 while(T--)
13 {
14 int n;
15 scanf("%d",&n);
16 for(int i=1; i<=n-1; i++)
17 {
18 scanf("%lld",&a[i]);
19 }
20 for(int i=0; i<=2*n+2; i++)
21 {
22 dp[i]=-inf;
23 }
24 dp[0]=0;
25 for(int i=1; i<n-1; i++)
26 {
27 for(int j=i; j<=n-2; j++)
28 {
29 dp[j]=max(dp[j],dp[j-i]+a[i+1]-a[1]);// 对于当前的度,我们是先假设每个点先分配了一个度,所以是a[i+1],又因为一开始分配了一个度,所以需要将a[1]给去掉。
30 }
31 }
32 printf("%lld\n",dp[n-2]+a[1]*n);
33 }
34 return 0;
35 }