Partial Tree

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

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
 
  • 给出n个点让建树
  • 对于一个度为d的点有函数f(d)的对应数值,使得将所有节点度数对应函数数值加和最大
  • 显然不可能一个一个地建树
  • 对于二叉树来说对于节点数n,所有可建树的种类与卡特兰数有关,何况这题不限于二叉树
  • 测试n在比较小的时候几个例子,不难看出每次随着点数的扩增,都是从(n-1)的每种度数序列中将一个点度数增1,度数为1的点增1
  • 那么这里会引发出两种思路,一种是贪心,一种是递推,或者说是dp
  • 先说贪心的想法:
  • 每次节点数量增1的过程中,贪心地看当前度数序列中哪一个度数增1后节点度数对应函数值增量最大,然后总是挑增量最大的点来增加度数
  • 看似很有道理,但是有一个明显的反例,就是说f(n-1)数值远远超过其他数值,贪心的思路不能保证最后可以推到一个点有n-1个度的情况,因为每次贪的是当前的最大增量,在增加点的过程中很有可能对于函数f(d)会有卡在某一度数的情况,例如:a<b<c, f(a)<f(b), f(b)>f(c)。在这种情况下贪心策略可能会让尽可能多的点集中到度数b而计算不到度数在c以后的情况
  • 递推想法一:
  • 根据节点数递推,用dp[n]推出dp[n+1]
  • 看似正确,但是其思路其实和贪心策略一致
  • 但是更深层次的考虑的话会发现dp[n]和dp[n+1]没有一致的结构保障,意思是节点数n的结果和节点数n+1的建树结果不能保证除1点外完全相同
  • 而如果考虑用dp[1--n]推dp[n+1]也是一样,没有结构一致的保证,也没有保证第n+1棵数是由之前多少棵数组合而成,都是不确定的,没有保障的
  • 递推想法二:
  • 之前的两种思路都是在点的基础上引发的,我们现在考虑这个题中的重要变量,就是节点的度
  • 对于n和节点的树,有n-1个边,2n-2个度,每个节点至少1个度,一条边包含两边节点的2个度
  • 我们不妨把度看做半个边,两个度为1条边,对于度做dp
  • 这样做的好处在于同一度数序列对应不止一个树的结构,可以进行扩展
  • 初始化每个节点1个度,扩展次数为n-2次
  • 每次从之前的情况递推,max更新dp[n+1]即可
  • dp[i]=max(dp[i],dp[j]+f[i-j+1]-f[1]);(j<i)
  • 其中减去的f[1]对应初始赋给每一个点的值,这里的意义在于对于前一种情况j,条一个度数为1的点进行扩展,将(i-j+1)个点组合在一起,形成一个菊花状(好吧,多校的题解里有类似的题,然后就用菊花来形容了),而且可以保证和原始树相连,就达成了扩展的操作
 #include <iostream>
#include <string>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
typedef long long LL ;
typedef unsigned long long ULL ;
const int maxn = 1e5 + ;
const int inf = 0x3f3f3f3f ;
const int npos = - ;
const int mod = 1e9 + ;
const int mxx = + ;
const double eps = 1e- ;
const double PI = acos(-1.0) ; int T, n;
LL f[maxn], c[maxn];
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
while(~scanf("%d",&T)){
while(T--){
scanf("%d",&n);
for(int i=;i<n;i++)
scanf("%lld",&f[i]);
c[]=n*f[];
for(int i=;i<=n-;i++){
c[i]=0LL;
for(int j=;j<i;j++){
c[i]=max(c[i],c[j]+f[i-j+]-f[]);
}
}
printf("%lld\n",c[n-]);
}
}
return ;
}

HDU_5534_Partial Tree的更多相关文章

  1. [数据结构]——二叉树(Binary Tree)、二叉搜索树(Binary Search Tree)及其衍生算法

    二叉树(Binary Tree)是最简单的树形数据结构,然而却十分精妙.其衍生出各种算法,以致于占据了数据结构的半壁江山.STL中大名顶顶的关联容器--集合(set).映射(map)便是使用二叉树实现 ...

  2. SAP CRM 树视图(TREE VIEW)

    树视图可以用于表示数据的层次. 例如:SAP CRM中的组织结构数据可以表示为树视图. 在SAP CRM Web UI的术语当中,没有像表视图(table view)或者表单视图(form view) ...

  3. 无限分级和tree结构数据增删改【提供Demo下载】

    无限分级 很多时候我们不确定等级关系的层级,这个时候就需要用到无限分级了. 说到无限分级,又要扯到递归调用了.(据说频繁递归是很耗性能的),在此我们需要先设计好表机构,用来存储无限分级的数据.当然,以 ...

  4. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,0 ...

  5. Leetcode 笔记 110 - Balanced Binary Tree

    题目链接:Balanced Binary Tree | LeetCode OJ Given a binary tree, determine if it is height-balanced. For ...

  6. Leetcode 笔记 100 - Same Tree

    题目链接:Same Tree | LeetCode OJ Given two binary trees, write a function to check if they are equal or ...

  7. Leetcode 笔记 99 - Recover Binary Search Tree

    题目链接:Recover Binary Search Tree | LeetCode OJ Two elements of a binary search tree (BST) are swapped ...

  8. Leetcode 笔记 98 - Validate Binary Search Tree

    题目链接:Validate Binary Search Tree | LeetCode OJ Given a binary tree, determine if it is a valid binar ...

  9. Leetcode 笔记 101 - Symmetric Tree

    题目链接:Symmetric Tree | LeetCode OJ Given a binary tree, check whether it is a mirror of itself (ie, s ...

随机推荐

  1. Spring Cloud心跳监测

    Spring Cloud实现心跳监测,在服务注册和停止时,注册中心能得到通知,并更新服务实例列表 Spring Cloud注册中心添加配置: eureka.server.enable-self-pre ...

  2. Qt5中的QtGui

    我在学习Qt查看Qt Creater提供的例子时,遇到了一个小问题.就是明明在代码中包含了QtGui,然而编译的时候还是提示找不到QLabel的定义,以及其他一些类的定义,但是这是官方提供的文档的啊, ...

  3. 基于jQuery的时间轴鼠标悬停动画插件

    之前为大家分享了很多jquery插件,这次我们要来分享一款不太常见的jQuery插件,它是一个时间轴,时间轴上的每一个点在鼠标滑过时都可以显示该点的描述信息,并且鼠标滑过时都可以产生一定的动画特效,比 ...

  4. android版本号始终为1

    之前用Eclipse里时,版本号是检查是做如下 <manifest xmlns:android="http://schemas.android.com/apk/res/android& ...

  5. MapReduce原理<转>

    江湖传说永流传:谷歌技术有"三宝",GFS.MapReduce和大表(BigTable)! 谷歌在03到06年间连续发表了三篇很有影响力的文章,分别是03年SOSP的GFS,04年 ...

  6. 配置ubuntu - tftp server服务器步骤

    配置Ubuntu tftp服务的步骤: 1.安装相关软件包:Ubuntu tftp(服务端),tftp(客户端),xinetd sudo apt-get install tftpd tftp xine ...

  7. TVS二极管的主要参数与选型

    TVS二极管的主要参数--转载 处理瞬时脉冲对器件损害的最好办法是将瞬时电流从敏感器件引开.TVS二极管在线路板上与被保护线路并联,当瞬时电压超过电路正常工作电压后,TVS二极管便发生雪崩,提供给瞬时 ...

  8. php5共存php7

    PHP7与PHP5共存于CentOS7 原文参考 原理 思路很简单:PHP5是通过yum安装的在/usr/,套接字在/var/run/php-fpm.socket,PHP7自己编译装在/usr/loc ...

  9. Entity Framework中的实体类添加复合主键

    使用Code First模式实现给实体类添加复合主键,代码如下: using System; using System.Collections.Generic; using System.Compon ...

  10. eclipse启动无响应,老是加载不了revert resources,或停留在Loading workbench状态

    做开发的同学们或多或少的都会遇到eclipse启动到一定程度时,就进入灰色无响应状态再也不动了.启动画面始终停留在Loading workbench状态.反复重启,状态依旧. 多数情况下,应该是非正常 ...