H - Partial Tree HDU - 5534 (背包)

时间:2022-05-22 18:57:04

题目链接:

H - Partial Tree

 HDU - 5534

题目大意:首先是T组测试样例,然后n个点,然后给你度数分别为(1~n-1)对应的不同的权值,然后问你在这些点形成树的前提下的所能形成的最大权值。

具体思路:

这个题是学长做的,我记录一下思路。

有点背包的感觉,但是和之前我做过的有点不同,原来的背包是互相不会影响的。但是对于这个题,我们需要的前提是形成一棵树,所以为了解决这个问题,我们先给每个点分配一个度,然后再去把剩余的n-2的度再分配下去就可以了。

AC代码:

 #include<bits/stdc++.h>
using namespace std;
# define ll long long
# define inf 0x3f3f3f3f
const int maxn = 2e5+;
ll dp[maxn];
ll a[maxn];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
for(int i=; i<=n-; i++)
{
scanf("%lld",&a[i]);
}
for(int i=; i<=*n+; i++)
{
dp[i]=-inf;
}
dp[]=;
for(int i=; i<n-; i++)
{
for(int j=i; j<=n-; j++)
{
dp[j]=max(dp[j],dp[j-i]+a[i+]-a[]);// 对于当前的度,我们是先假设每个点先分配了一个度,所以是a[i+1],又因为一开始分配了一个度,所以需要将a[1]给去掉。
}
}
printf("%lld\n",dp[n-]+a[]*n);
}
return ;
}