Partial Tree---hdu5534(完全背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534

题意:有n个节点,让这n个节点形成一棵树,这棵树的种类有很多种,现在告诉n-1个f[i],表示度为 i 的点的权值为f[i],求我们形成的那棵树的所有节点的权值和最大值;

n个节点形成的树的度数和为2*n-2,由于是一棵树,所以每个点一定有一个度,我们先把结果加上n*f[1] ,

那么还剩下n-2个度,通过举例不难发现,无论这n-2个度怎么分给n个点,都能构造出一棵树;

接下来我们就相当于是有编号为2到n-1的物品(共n-2个)(分配的时候因为已经分了1个度了,所以要把2~n-1的度看为1~n-2),每个物品的价值为f[i]-f[1];

每个物品的体积为i(编号), 现有背包的体积大小为n-2,求把背包装满的最大价值;

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<queue>
#include<set>
using namespace std;
#define met(a, b) memset(a, b, sizeof(a))
#define N 2105
#define INF 0x3f3f3f3f
typedef long long LL;

int v[N], dp[N];

int main()
{
    int T, n;
    scanf("%d", &T);
    while(T--)
    {
        scanf("%d", &n);
        for(int i=1; i<n; i++)
        {
            scanf("%d", &v[i]);
            if(i != 1) v[i] = v[i] - v[1];
        }
        int ans = n*v[1];

        for(int i=1; i<n; i++)
        {
            v[i] = v[i+1];
            dp[i] = -INF;
        }
        dp[0] = 0;

        for(int i=1; i<n-1; i++)
        {
            for(int j=i; j<=n-2; j++)
                dp[j] = max(dp[j], dp[j-i]+v[i]);
        }
        printf("%d\n", dp[n-2]+ans);
    }
    return 0;
}

时间: 2024-08-09 18:47:14

Partial Tree---hdu5534(完全背包)的相关文章

HDU 5534 Partial Tree 完全背包

一棵树一共有2*(n-1)度,现在的任务就是将这些度分配到n个节点,使这n个节点的权值和最大. 思路:因为这是一棵树,所以每个节点的度数都是大于1的,所以事先给每个节点分配一度,答案 ans=f[1]*n 先将答案赋值 所以接下来研究的就是,将剩下的n-2个度分配 即分别看 分配度数为1到n-2的节点的有几个(因为每个节点已经有一度),然后因为每个节点都加上了权值f[1],所以这时f[2]=f[2]-f[1],以此类推, 看到这里,就是一个完全背包问题:如果还没看出来,详细一点 有1到n-2这些

hdu 5534 (完全背包) 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

hdu5534 Partial Tree dp(难)

hdu5534 Partial Tree  dp(难) Partial Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 374    Accepted Submission(s): 209 Problem Description In mathematics, and more specifically in graph t

HDU - 5534 Partial Tree(每种都装的完全背包)

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 o

2015ACM/ICPC亚洲区长春站 G hdu 5534 Partial Tree

Partial Tree Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 228    Accepted Submission(s): 138 Problem Description In mathematics, and more specifically in graph theory, a tree is an undirect

URAL_1018 Binary Apple Tree 树形DP+背包

这个题目给定一棵树,以及树的每个树枝的苹果数量,要求在保留K个树枝的情况下最多能保留多少个苹果 一看就觉得是个树形DP,然后想出 dp[i][j]来表示第i个节点保留j个树枝的最大苹果数,但是在树形过程中,有点难表示转移 后来看了下大神的做法才知道其实可以用背包来模拟 树枝的去留,其实真的是个背包诶,每个子树枝就相当于物品,他占用了多少树枝量,带来多少的收益,就是用背包嘛,于是用树形DP+背包就可以做了 #include <iostream> #include <cstdio> #

[HDOJ5534] Partial Tree(脑洞,完全背包)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534 题意:给n个点,希望用这n个点构成一棵树,然后每一个度有一个价值,希望价值总和最大.问最大价值. 知道一棵树的度和为2*n-2,并且每一个点必然有1的度,在每个点持有1度的情况下,相当于给n个点分n-2个度.试验发现,无论如何分配,都可以构成一棵树. 这样问题就变成了容量为n-2的背包,有2~n-2个物品,价值分别为v(i)的完全背包问题. 先让所有价值减去度为1的价值,做完全背包后再加回去.

HDU 5534 Partial Tree (完全背包变形)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5534 题意: 给你度为1 ~ n - 1节点的权值,让你构造一棵树,使其权值和最大. 思路: 一棵树上每个节点的度至少为1,且度的和为2*n - 2.那么我们先给这些节点的度都-1,剩下的节点度为n - 2.此时我们发现,任意分配剩下的这些度给节点,都可以形成一棵树.这就变成了一个完全背包题,容量为n-2.注意dp要初始化为-inf.思路确实巧妙. 1 #include <iostream> 2

【hdu5534】【2015ACM/ICPC亚洲区长春站】Partial Tree 题意&题解&代码

题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5534 题意: 构造一棵有n个节点的数,f[i]表示度数(入度+出度)为i的节点的点权,给出所有的f[i],问这棵树最大点权. 题解: 一道dp题,思维很巧妙 一共有n个点则总度数为2×(n-1),首先每个点至少也要一度则将这确定的一度先分配到每个点上,接下来还剩下n-2度没有分配,因为度数是任意分配的,接下来我们可以把问题看做将n-2度分配任意多个n-2度,n-3度,n-4度----1度使得分配完

【HDOJ5534】Partial Tree(树,背包DP)

题意:有一棵n个点的形态不定的树,每个度为i的节点会使树的权值增加f[i],求树的最大权值 n<=2015,0<=f[i]<=1e4 思路:对不起队友,我再强一点就能赛中出这题了 显然每个点的度至少为1,且度数为1的节点至少有2个(From 队友) 有一个结论:给每个点都分配1个度,剩余的度任意分配,一定能构造出对应的方案 仔细想想题面里的生成树数量不就在暗示我有类似Prufer序的性质么--序列与构造一一对应--唉太菜了 然后就是经典的完全背包问题了 每个点分配一个度之后还剩余n-2个