zoukankan      html  css  js  c++  java
  • hdu5534 Partial Tree

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)
    Total Submission(s): 126    Accepted Submission(s): 68


    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 n1 edges. You want to complete this tree by adding n1 edges. There must be exactly one path between any two nodes after adding. As you know, there are nn2 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 n1 integers f(1),f(2),,f(n1).

    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的树的度数和玮2*n-2,所以问题就转换为了把2*n-2个度分配给n个节点所能获得的最大价值,而且每一个节点至少分到1个度。我们可以先每一个分一个度,然后把n-2个节点任意分配完。分配的时候因为已经分了1个度了,所以要把2~n-1的度看为1~n-1,然后做个完全背包就行了。

    #include<iostream>
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #include<math.h>
    #include<vector>
    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<string>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    #define inf 99999999
    int v[2200],dp[2200];
    int main()
    {
        int n,m,i,j,T;
        scanf("%d",&T);
        while(T--)
        {
            scanf("%d",&n);
            for(i=1;i<=n-1;i++){
                scanf("%d",&v[i]);
            }
            int ans=0;
            ans+=v[1]*n;
            for(i=2;i<=n-1;i++){
                v[i]-=v[1];
            }
            for(i=1;i<=n-2;i++){
                dp[i]=-inf;
            }
            dp[0]=0;
            for(i=1;i<=n-2;i++){
                v[i]=v[i+1];
            }
            for(i=1;i<=n-2;i++){
                for(j=i;j<=n-2;j++){
                    dp[j]=max(dp[j],dp[j-i]+v[i]);
                }
            }
            ans+=dp[n-2];
            printf("%d
    ",ans);
        }
    }
    


  • 相关阅读:
    使用zipkin2在SpringCloud2.0环境下追踪服务调用情况
    Spring Cloud负载均衡:使用Feign作客户端负载均衡
    Spring Cloud负载均衡:使用zuul作服务器端负载均衡
    Word模板替换
    【转】Eureka集群
    巧用JavaScript语言特性解耦页面间调用(观察者模式)
    MySQL 视图触发器事务存储过程函数
    MySQL py模块的链接Navicat可视化工具
    MySQL 单表查询多表查询
    MySQL 表与表之间建立关系
  • 原文地址:https://www.cnblogs.com/herumw/p/9464620.html
Copyright © 2011-2022 走看看