• Partial Tree(DP)


     Partial Tree

    http://acm.hdu.edu.cn/showproblem.php?pid=5534

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
    Total Submission(s): 2190    Accepted Submission(s): 1096
    
    
    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亚洲区长春站-重现赛(感谢东北师大)
     
    
    Recommend
    hujie

     因为每个点最少的度数为1,所以可以先设每个点的度数为1,剩余的度数为(2*n-2)-n=n-2,相当于把剩下的n-2个度分给n个顶点,这样就转化为完全背包的题目了

     1 #include<bits/stdc++.h>
     2 const int INF=0x3f3f3f3f;
     3 using namespace std;
     4 
     5 int a[2505];
     6 int dp[5505];
     7 
     8 int main(){
     9 
    10     int t;
    11     scanf("%d",&t);
    12     while(t--){
    13         int n;
    14         scanf("%d",&n);
    15         for(int i=1;i<n;i++){
    16             scanf("%d",&a[i]);
    17         }
    18         int ans=a[1]*n;
    19         for(int i=1;i<=n;i++) dp[i]=-INF;
    20         dp[0]=0;
    21         for(int i=2;i<n;i++) a[i]-=a[1];
    22         for(int i=2;i<n;i++){
    23             for(int j=0;j<=n-2;j++){
    24                 dp[i+j-1]=max(dp[i+j-1],dp[j]+a[i]);
    25             }
    26         }
    27         printf("%d
    ",ans+dp[n-2]);
    28     }
    29 
    30 }
    View Code
  • 相关阅读:
    <Learning How to Learn>Week One: Focused versus Diffuse Thinking
    "Principles of Reactive Programming" 之<Actors are Distributed> (2)
    "Principles of Reactive Programming" 之<Actors are Distributed> (1)
    "reactive programming"的概念
    "Principles of Reactive Programming" 之 <Persistent Actor State>学习笔记
    从List[Future[T]]到Future[List[T]]
    用IDEA调试Play工程
    Scala的Pattern Matching Anonymous Functions
    Akka的fault tolerant
    Manifest 与TypeTag
  • 原文地址:https://www.cnblogs.com/Fighting-sh/p/9727075.html
Copyright © 2020-2023  润新知