1. 程式人生 > >HDU-5534-Partial Tree

HDU-5534-Partial Tree

fir fun cst ted () gree where put 由於

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?

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)
.

1T2015
2n2015
0f(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]);
    }
}

HDU-5534-Partial Tree