HDU-5534-Partial Tree
Partial Tree
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 2061 Accepted Submission(s): 1023
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?
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.
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
题意:给你一颗含有n个点的树,有n-1条边,每一个度数都有相应的value,问这棵树的最大的value值是多少
思路:n-1条边,也就是度数只和为2n-2,就可以转化为一个完全背包问题,一开始先把所有的点都看作是单个的一度顶点,之后在进行dp
#include<iostream> #include<cstdio> #include<algorithm> #include<cstring> #include<cmath> #include<cstdlib> #include<queue> #include<set> #include<vector> using namespace std; #define INF 0x3f3f3f3f #define eps 1e-10 #define PI acos(-1.0) #define ll long long int const maxn = 1e5+7; const int mod = 1e9 + 7; int gcd(int a, int b) { if (b == 0) return a; return gcd(b, a % b); } int val[2020]; int dp[2020]; int main() { int T; scanf("%d",&T); while(T--) { int n; scanf("%d",&n); for(int i=1;i<=n-1;i++) scanf("%d",&val[i]); int v=2*(n-1)-n; //一开始将所有的点都看作一度顶点,那么剩余的定点就是2*(n-1)-n,接下来将v个度数进行dp for(int i=1;i<=n-1;i++) dp[i]=-INF; dp[0]=val[1]*n; //一开始将dp[0]初始化为所有的点都是一度顶点的总value值 for(int i=2;i<=n-1;i++) //从二度顶点到n-1度顶点开始循环dp for(int j=i-1;j<=v;j++) //最多只有v个顶点可以进行调控 dp[j]=max(dp[j],dp[j-i+1]+val[i]-val[1]); //增添一个度数为i的顶点,一开始由于所有的顶点都是一度顶点,所以使用的cost是i-1,而得到的value值是val[i]-val[1] printf("%d\n",dp[v]); } }