zoukankan      html  css  js  c++  java
  • HDU

    Partial Tree

    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 nn nodes but lacks of n1n−1 edges. You want to complete this tree by adding n1n−1edges. There must be exactly one path between any two nodes after adding. As you know, there are nn2nn−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)f(d), where ff is a predefined function and dd is the degree of this node. What's the maximum coolness of the completed tree?

    InputThe first line contains an integer TT indicating the total number of test cases. 
    Each test case starts with an integer nn in one line, 
    then one line with n1n−1 integers f(1),f(2),,f(n1)f(1),f(2),…,f(n−1). 

    1T20151≤T≤2015 
    2n20152≤n≤2015 
    0f(i)100000≤f(i)≤10000 
    There are at most 1010 test cases with n>100n>100.
    OutputFor 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




    因为每种装的范围为【1,+无穷】,然而分组背包的三次方会T,所以要想办法将其转化为完全背包模型。
    因为每个点都至少有一度,所以我们预先放入n个一度,本来要放的2×n-2度现在只剩n-2度。
    每当再次放入一个x度时,他的贡献为x-1度,在放入的同时减掉之前预先放好的一度。这样便保证了每个点至少有一度。

    #include<bits/stdc++.h>
    #define MAX 2018
    #define INF 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    
    int a[MAX];
    ll dp[MAX];
    
    int main()
    {
        int t,n,m,i,j,k;
        scanf("%d",&t);
        while(t--){
            scanf("%d",&n);
            for(i=1;i<n;i++){
                scanf("%d",&a[i]);
            }
            memset(dp,-INF,sizeof(dp));
            dp[0]=0;
            for(i=2;i<n;i++){
                for(j=i-1;j<=n-2;j++){
                    dp[j]=max(dp[j],dp[j-(i-1)]+a[i]-a[1]);
                }
            }
            printf("%I64d
    ",dp[n-2]+n*a[1]);
        }
        return 0;
    }
     
  • 相关阅读:
    PS 如何制作眼泪效果
    PS 基础知识 什么是Adobe Bridge
    PS 抠图如何使用通道法处理头发
    PS 如何使用抽出滤镜抠人物的头发丝等细节
    PS 如何用PS制作GIF图像
    PS 如何制作柔和的边框
    PS 基础知识 如何绘制几何图形
    PS 基础知识 渐变编辑器如何使用
    PS 基础知识 CMYK全称是什么
    [Functional Programming] Daggy
  • 原文地址:https://www.cnblogs.com/yzm10/p/9735461.html
Copyright © 2011-2022 走看看