H - Partial Tree HDU - 5534 (背包)

题目链接:

H - Partial Tree

 HDU - 5534 

题目大意:首先是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 }

 

 

posted @ 2019-04-24 16:52  Let_Life_Stop  阅读(210)  评论(0编辑  收藏  举报