摘要: 题意:在一棵树上选出一些点,每个点都有一个权值,使得和最大,前提是,父节点和子节点只能选一个。分析:整个代码与1054基本一样的,就是状态转移方程变了 ,因为题目加了一些限制dp[i][0]表示以i为根节点的不选i树的最大权值和dp[i][1]表示以i为根节点的选i的树的最大权值和状态转移方程:dp[i][0]+=max(dp[son[i][j]][0],dp[son[i][j]][1]),(0<j<size[i])dp[i][1]+=dp[son[i][j]][0];(0<j<size[i]) size[i]表示i节点的儿子数#include<iostream>#include& 阅读全文
posted @ 2011-11-30 19:18 枕边梦 阅读(213) 评论(0) 推荐(0) 编辑
摘要: 嘿嘿,我的第一道树形DP题意:用最少的点覆盖整棵树,看一下Sample Input 就知道题意。分析:在树上做一个动态规划【状态】:dp[i][0] 为以 i 为根节点,并且该节点不放,所需要的最少的点数dp[i][1] 为以 i 为根节点,并且该节点放,所需要的最少的点数【转移方程】:dp[i][0]=sum(dp[son[i][j]][1]) 该点不放的话,那么它的儿子节点必须都放,这样之间的边才可以被覆盖dp[i][1]=sum(min(dp[son[i][j]][0],dp[son[i][j]][1])) 该点放的话,那么它的儿子节点就有两种决策,一种是放,一种是不放,取 min 就行 阅读全文
posted @ 2011-11-30 18:21 枕边梦 阅读(996) 评论(0) 推荐(0) 编辑
摘要: 与一般的背包问题不同,要求的是第K优解,首先,我们要搞清楚的一个问题就是最优解是怎么求出来的。对于求最优解的情况,我们对每一种状态只保存了该状态下的最优解,忽略了其他解,进而实现状态之间的转移,而对于求第K优解的情况呢?其实只需要保存每一种状态下的前K优解,从这K个状态进行状态间的转移,同时去重,保存当前状态的K优解即可。#include<iostream>#include<algorithm>#include<set>using namespace std;int v[101],w[101];int n,m,k,dp[1010][31];int tmp[6 阅读全文
posted @ 2011-11-30 14:52 枕边梦 阅读(506) 评论(0) 推荐(0) 编辑
摘要: 看完背包九讲的多重背包之后,这题目应该可以轻松做出来了模型:有N种物品和一个容量为V的背包。第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。方法:基本算法这题目和完全背包问题很类似。基本的方程只需将完全背包问题的方程略微一改即可,因为对于第i种物品有n[i]+1种策略:取0件,取1件……取n[i]件。令f[i][v]表示前i种物品恰放入一个容量为v的背包的最大权值,则有状态转移方程:f[i][v]=max{f[i-1][v-k*c[i]]+k*w[i]|0<=k<=n[i]}复杂度是O( 阅读全文
posted @ 2011-11-30 14:42 枕边梦 阅读(2264) 评论(0) 推荐(0) 编辑