依赖背包变形——poj1947(经典)】的更多相关文章

/*这题显然不适用依赖背包的优化,因为不能保证根是必选的,但是可以按照常规依赖背包的思路进行转移,即每次对一个儿子进行C^2的转移 还是树形的背包,dp[u][j]表示u的子树里,切割出一个大小为j的包含u的联通块的代价 那么dp[u][j]按照常规的依赖背包转移即可 初始状态时dp[u][1],切割掉u的所有儿子的代价 注意本题需要特别讨论u是根和非根的情况,即非根的儿子是度数-1,但是最后以这个点作为中心时就要加上这个减掉的1 */ #include<bits/stdc++.h> #inc…
这个题用优化后的依赖背包做难以实现,所以用常规的泛化物品的和来做即可 每个节点的容量定义为这个节点下的叶子结点个数,dp[u][j]用来表示节点u下选取j个物品的最大收益,最后从m-0查询dp[1][i],一旦发现是非负数,i则是答案 需要注意的地方:初始化时将所有的dp[i][0]都赋值为0,一个都不选,代价当然是0 dfs遇到u是叶子结点,那么dp[u][1]定义为这个结点的权值,其余状态用-inf来表示不可达 其余状态全部赋初始值为-inf,表示目前不可达 #include<iostrea…
由于不是求最大的可拦截的HP值,而是要将最小值最大化,那么就需要分配每个子树用的钱数以达到最小值最大化 第一步解决如何分配钱使得结点u的子树中用了j元钱后可以拦截的HP最大,这就是变形的分组(依赖)背包,即枚举m元钱,在子树v用t元钱,在v之前的子树用j-t元钱 用Max[v][j]数组记录u的前v个结点花j元钱可以拦截的最大HP,Max[v][j]=max{min( dp[v][t] , Max[v-i][j-t] )},第一维v可以压缩掉 第二步考虑结点u上建立什么炮塔,用Max数组来求出d…
思维性比较强,代码挺简单的,dp[u][j]表示在u子树下安排j个机器人,让其不回u 注意转移时的初始值 /* dp[u][j]为在子树u有j个机器人不回来 */ #include<bits/stdc++.h> using namespace std; #define N 10005 ]; int head[N],tot,n,k,s; void init(){ memset(head,-,; } void add(int u,int v,int w){ e[tot].to=v;e[tot].w…
题目来源:2019 ACM ICPC Xi'an University of Posts & Telecommunications School Contest 链接:https://www.jisuanke.com/contest/2382?view=challenges Description 众所周知,由于木星引力的影响,世界各地的推进发动机都需要进行重启.现在你接到紧急任务,要去收集火石碎片,重启西邮发动机. 现在火石碎片已成为了稀缺资源,获得火石碎片需要钱或者需要一定的积分.火石碎片有…
题目链接:Knapsack problem 大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积. 问,最多能盛的物品价值和是多少? 思路:01背包变形,因为w太大,转而以v为下标,求出价值对应的最小体积,然后求出能够满足给出体积的最大价值. 经典题目,思路倒是挺简单的,就是初始化总觉得别扭...T_T大概,因为我要找的是最小值,所以初始化为maxn,就结了? 这个问题好像叫01背包的超大背包... 模拟一下样例吧! 1 5 15 // 初始化为dp[0] =…
经典题了,网上博客一大堆O(nCC)的做法,其实是可以将复杂度降到O(nC)的 参考依赖背包优化(泛化物品的并) 根据背包九讲,求两个泛化物品的和复杂度是O(CC)的,所以依赖背包暴力求解的复杂度是O(nCC) 然后对其进行优化,考虑 F[u][j] 用来表示以结点u为根的子树(不包括u)体积为j的全局最大价值枚举u的儿子v,求F[v][j]数组,因为要求以v为根的子树,必须先选v,所以把v强行塞到背包里即通过F[v][j]=F[u][j]+W[v] (j<=C-V[v])这个赋值来表示j子树的…
The Ghost Blows Light Problem Description My name is Hu Bayi, robing an ancient tomb in Tibet. The tomb consists of N rooms (numbered from 1 to N) which are connected by some roads (pass each road should cost some time). There is exactly one route be…
C. Dima and Salad time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Dima, Inna and Seryozha have gathered in a room. That's right, someone's got to go. To cheer Seryozha up and inspire him to…
题目: 链接:点击打开链接 题意: 非常明显的依赖背包. 思路: dp[i][j]表示以i为根结点时攻击j个城堡得到的最大值.(以i为根的子树选择j个点所能达到的最优值) dp[root][j] = max(dp[root][j],dp[root][k]+dp[u][j-k]); u递归根结点,root当前根结点,每一个城堡之间的依赖关系形成森林.应该转化为树.再树形dp.仅仅需添加一个根结点即可.m++. 代码: #include<iostream> #include<cstdio&g…