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

题意:有一棵n个点的形态不定的树,每个度为i的节点会使树的权值增加f[i],求树的最大权值

n<=2015,0<=f[i]<=1e4

思路:对不起队友,我再强一点就能赛中出这题了

显然每个点的度至少为1,且度数为1的节点至少有2个(From 队友)

有一个结论:给每个点都分配1个度,剩余的度任意分配,一定能构造出对应的方案

仔细想想题面里的生成树数量不就在暗示我有类似Prufer序的性质么……序列与构造一一对应……唉太菜了

然后就是经典的完全背包问题了

每个点分配一个度之后还剩余n-2个度,每个点的分配到1之后多出来的度是[0,n-2]

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<ctime>
 6 #include<cmath>
 7 #include<algorithm>
 8 #include<iomanip>
 9 #include<vector>
10 #include<map>
11 #include<set>
12 #include<bitset>
13 #include<queue>
14 #include<stack>
15 using namespace std;
16 typedef long long ll;
17 typedef unsigned int uint;
18 typedef unsigned long long ull;
19 typedef pair<int,int> PII;
20 typedef vector<int> VI;
21 #define fi first
22 #define se second
23 #define MP make_pair
24 #define N   2100
25 #define M   110000
26 #define eps 1e-8
27 #define pi  acos(-1)
28 #define oo  1000000000
29 #define MOD 10007
30
31 int a[N],f[N],dp[N];
32
33
34 int main()
35 {
36     //freopen("hdoj5534.in","r",stdin);
37     //freopen("hdoj5534.out","w",stdout);
38     int cas;
39     scanf("%d",&cas);
40     for(int v=1;v<=cas;v++)
41     {
42         int n;
43         scanf("%d",&n);
44         for(int i=1;i<n;i++) scanf("%d",&a[i]);
45         for(int i=1;i<n;i++) f[i-1]=a[i]-a[1];
46         int m=n-2;
47         memset(dp,0,sizeof(dp));
48         dp[0]=n*a[1];
49         for(int i=1;i<=m;i++)
50          for(int j=1;j<=i;j++) dp[i]=max(dp[i],dp[i-j]+f[j]);
51         printf("%d\n",dp[m]);
52     }
53     return 0;
54 }
55
56     

原文地址:https://www.cnblogs.com/myx12345/p/9879946.html

时间: 2024-11-09 21:10:11

【HDOJ5534】Partial Tree(树,背包DP)的相关文章

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这些

【bzoj4987】Tree 树形背包dp

题目描述 从前有棵树. 找出K个点A1,A2,…,Ak. 使得∑dis(AiAi+1),(1<=i<=K-1)最小. 输入 第一行两个正整数n,k,表示数的顶点数和需要选出的点个数. 接下来n-l行每行3个非负整数x,y,z,表示从存在一条从x到y权值为z的边. I<=k<=n. l<x,y<=n 1<=z<=10^5 n <= 3000 输出 一行一个整数,表示最小的距离和. 样例输入 10 7 1 2 35129 2 3 42976 3 4 244

poj2486--Apple Tree(树状dp)

Apple Tree Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7789   Accepted: 2606 Description Wshxzt is a lovely girl. She likes apple very much. One day HX takes her to an apple tree. There are N nodes in the tree. Each node has an amoun

[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的价值,做完全背包后再加回去.

【弱校胡策】2016.4.14 (bzoj2164)最短路+状压DP+矩阵乘法+高斯消元+树链剖分+线段树+背包DP

cyyz&qhyz&lwyz&gryz弱校胡策 命题人:cyyz ws_fqk T3暴力写挫了 50+10+0滚粗辣! 奇妙的约会(appointment.cpp/c/pas) [问题描述] DQS和sxb在网上结识后成为了非常好的朋友,并且都有着惊人 的OI水平.在NOI2333的比赛中,两人均拿到了金牌,并保送进入 HU/PKU.于是两人决定在这喜大普奔的时刻进行面基. NOI2333参赛选手众多,所以安排了n个考点,DQS在1号考点, 而sxb在n号考点.由于是举办全国性赛事

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

POJ 2486 Apple Tree ( 树型DP )

#include <iostream> #include <cstring> #include <deque> using namespace std; #define SIZE 230 #define BACK 1 #define AWAY 0 int DP[SIZE][SIZE][2]; bool visits[SIZE]; int vals[SIZE]; deque< int > tree[SIZE]; int num, steps; void dfs

Codeforces 461B - Appleman and Tree 树状DP

一棵树上有K个黑色节点,剩余节点都为白色,将其划分成K个子树,使得每棵树上都只有1个黑色节点,共有多少种划分方案. 个人感觉这题比较难.假设dp(i,0..1)代表的是以i为根节点的子树种有0..1个黑色节点的划分方案数. 当节点i为白色时,对于它的每个孩子的节点处理: 求dp(i, 0)时有: 1,将该节点与孩子节点相连,但要保证孩子节点所在的子树种没有黑色节点: 2,将该节点不与该孩子节点相连,则该孩子节点要保证所在子树种有黑色节点: 即dp(i, 0) = π(dp(j,0 ) + dp(

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

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