Partial Tree

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
 
题意:给你n个点,给你1到n-1的度数的价值,让你构造一棵树这颗树的价值就是,度数代表的价值和,问最大是多少,
 
题解:首先度的总和为2(n-1),并且每个节点度不为0。如果用二维dp[i][j]表示第i个节点还剩j个度的最优值,是没问题,但是复杂度为o(n3)。但是其实每个节点都要分配一个度,那么我们先给每个节点分配一个度,剩下n-2的度分给n个点,可以减掉一维,dp[i]表示i个度的最优值,因为度的个数是严格小于节点个数的。背包转移的权值为val[i]-val[1](可能有负数)
 
#include<cstdio>
using namespace std ;
#define inf 1000000
int main(){
int dp[],a,b,n,i,T,j;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&a);
for( i=;i<n;i++){dp[i]=-inf;}
for( i=;i<n;i++){
scanf("%d",&b);b=b-a;
for( j=i-;j<=n-;j++){
if(dp[j-(i-)]+b>dp[j])
dp[j]=dp[j-(i-)]+b;
}
}
printf("%d\n",n*a+dp[n-]);
}
return ;
}

代码

最新文章

  1. redis数据类型之—Sorted set
  2. 高仿淘宝和聚美优品商城详情页实现《IT蓝豹》
  3. [主页]大牛系列01:Microsoft Research的Johannes Kopf
  4. JavaScript的条件语句
  5. 因為 Hypervisor 未執行,所以無法啟動虛擬機器
  6. 李洪强iOS开发之上传照片时英文改中文
  7. 流媒体相关知识介绍 及其 RTP 应用
  8. android recovery模式及ROM制作
  9. 两次fopen不同的文件返回相同的FILE* 地址
  10. Android之ExpandableListView的属性(Group不展开)
  11. Oracle连接数过多释放机制
  12. IntelliJ IDEA 设置Output (输出窗口)窗口字体大小
  13. android开发_文本按钮 与 输入框
  14. React事件绑定与解绑
  15. μC/OS-II 信号量集
  16. Assembly.LoadFrom加载程序集类型转换失败解决方法
  17. Android逆向笔记之AndroidKiller与Android Studio的使用
  18. ledecode Reverse Words in a String III
  19. NYOJ 116 士兵杀敌二
  20. Javascript专题(三)c.各种轮播--上下滚动轮播(面向对象版本)

热门文章

  1. Win32基础知识整理
  2. JS——null
  3. js 学习笔记---基本概念
  4. 转:selenium自动化脚本错误总结
  5. Ubuntu14.4安装mysql
  6. C#调用Win32 api时的内存操作
  7. img、a标签的使用
  8. 使用scrapy爬取的数据保存到CSV文件中,不使用命令
  9. opencv图像阈值设置的三种方法
  10. C#关键字详解第六节