Partial Tree
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 2155 Accepted Submission(s): 1074
Problem Description
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 n nodes but lacks of n−1 edges. You want to complete this tree by adding n−1 edges. There must be exactly one path between any two nodes after adding. As you know, there are nn−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), where f is a predefined function and d is the degree of this node. What's the maximum coolness of the completed tree?
Input
The first line contains an integer T indicating the total number of test cases.
Each test case starts with an integer n in one line,
then one line with n−1 integers f(1),f(2),…,f(n−1).
1≤T≤2015
2≤n≤2015
0≤f(i)≤10000
There are at most 10 test cases with n>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
Source
2015ACM/ICPC亚洲区长春站-重现赛(感谢东北师大)
/// 一棵树的度的总和为 2 * (n - 1)
/// 每个节点保证一条度, 剩下 n - 2 条度
/// 度数确定 > 1 一定可以建成一棵树
#include <bits/stdc++.h>
using namespace std;
const int mt = 2020, mn = 2020, mf = 10010;
int f[mn];
int add[mn];
int dp[mn];
int main()
{
int T;
scanf("%d", &T);
while (T--)
{
int n;
scanf("%d", &n);
for (int i = 1; i < n; i++)
scanf("%d", &f[i]);
for (int i = 1; i < n; i++) // 一个点的度变为i(增加 i - 1)增加的贡献
add[i - 1] = f[i] - f[1];
memset(dp, 0, sizeof dp);
dp[0] = f[1] * n;
for (int i = 1; i <= 2 * (n - 1) - n; i++)
{
for (int j = 0; j <= i; j++)
dp[i] = max(dp[i], dp[i - j] + add[j]);
}
/// dp : 增加度数为 i 时的最大 f[i] 之和
/// 不额外增加时初始权值为 节点数 * f[1]
/// 度数 == i 时最大权值一定可由 某一个节点上增加 j度 转移
printf("%d\n", dp[n - 2]);
}
return 0;
}