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