【HDU - 5534】【Partial Tree】

题目:

In mathematics, and more specifically in graph theory, a tree is an undirected graph in which any two nodes are connected by exactly one path. In other words, any connected graph without simple cycles is a tree. 

You find a partial tree on the way home. This tree has nn nodes but lacks of n−1n−1edges. You want to complete this tree by adding n−1n−1 edges. There must be exactly one path between any two nodes after adding. As you know, there are nn−2nn−2 ways to complete this tree, and you want to make the completed tree as cool as possible. The coolness of a tree is the sum of coolness of its nodes. The coolness of a node is f(d)f(d), where ff is a predefined function and dd is the degree of this node. What's the maximum coolness of the completed tree?

Input

The first line contains an integer TT indicating the total number of test cases. 
Each test case starts with an integer nn in one line, 
then one line with n−1n−1 integers f(1),f(2),…,f(n−1)f(1),f(2),…,f(n−1). 

1≤T≤20151≤T≤2015 
2≤n≤20152≤n≤2015 
0≤f(i)≤100000≤f(i)≤10000 
There are at most 1010 test cases with n>100n>100.

Output

For each test case, please output the maximum coolness of the completed tree in one line.

Sample Input

2
3
2 1
4
5 1 4

Sample Output

5
19

题意:你在回家路上看到了个奇怪的树,有n个点,要求必须构成一个树,且每个节点都有自己的cool值,问能构成的树的最大cool值是多少?

解题思路:这些点首先要求是必须构成一棵树,n个点他们的度数之和为2*(n-1),如果咱们直接去寻求最大的cool值可能会存在度数为0的点,即构不成树,所以可以先将每个点的度数设为1,即会保证每个点都会有连接,剩下的n-2的度数,再进行完全背包,从n-2种度数中完全背包n-2度数,注意,咱们dp数组的下标表示的就是度数i的最大cool值。

ac代码:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define maxn 2020 
using namespace std;

int f[maxn];
int d[maxn];

int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		int n;
		cin>>n;
		for(int i=1;i<=n-1;i++)
			cin>>f[i];
		memset(d,-1e9-8,sizeof(d));
		d[0]=n*f[1];
		for(int i=1;i<=n-2;i++)
			for(int j=0;j<=n-2;j++)
			{
				if(j>=i)
					d[j]=max(d[j],d[j-i]+f[i+1]-f[1]);
			}
		cout<<d[n-2]<<endl;
	}
	return 0;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值