poj 1947 树形背包】的更多相关文章

http://blog.csdn.net/woshi250hua/article/details/7632785 这道题我一开始想的dp[i][j],i是节点,j是删除的点数,dp是最少删边的个数,然而状态转移方程不太好想. 而题解其实差不多,只不过j为剩余点的个数 这样我们就有最初状态,dp[i][1] = 子节点个数,而dp[i][j]就可以从子节点的状态推出来 dp[i][j] = min(dp[i][j],dp[i][k]-1+dp[s][j-k])  (1<=i<=n,2<=j…
重做这道题 http://blog.csdn.net/woshi250hua/article/details/7632785 http://blog.csdn.net/shuangde800/article/details/10150305 http://blog.csdn.net/alps233/article/details/51190997 #include <iostream> #include <string> #include <cstring> #incl…
http://blog.csdn.net/libin56842/article/details/9908199 树形背包: 首先是建树,每个结构体为一个节点,包括下一个点序号,值,和next. tree[ptr]会保存所有的节点序列,而head数组则是保存每个节点的最后一个子节点在序列中的位置,next则是保存上一个子节点在序列中的位置,若没有则为-1. 遍历时从i=head[root]出发,到i=-1结束,不断往子节点遍历,同一层之间用next遍历,就可以遍历树的所有节点. 树状dp.由于求的…
Rebuilding Roads Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 10663   Accepted: 4891 Description The cows have reconstructed Farmer John's farm, with its N barns (1 <= N <= 150, number 1..N) after the terrible earthquake last May. Th…
题目链接:  POJ 1155 TELE 分析:  用dp[i][j]表示在结点i下最j个用户公司的收益, 做为背包处理.        dp[cnt][i+j] = max( dp[cnt][i+j] , dp[cnt][i]+dp[son][j]-pay );       其中pay是cnt->son这一路径的成本 代码:  #include <iostream> #include <cstdio> #include <cstdlib> #include &l…
思路:dp[i][j]表示,以i节点为根,删去j个节点最少要断几条边. 那么dp[u][j]=min(dp[u][j],dp[v][k]+dp[u][j-k]);//选取最优状态 dp[u][j]=min(dp[u][j],dp[u][j-son[v]]+1);//切断与子节点相连的边 对于子节点 dp[v][n-son[v]]=1; dp[v][j]=min(dp[v][j],dp[v][j-n+son[v]]+1)//表示不需要由父节点过来的那条分支 最有从所有状态中选举最优的dp[i][n…
题意:电视台发送信号给很多用户,每个用户(叶子节点)有愿意出的钱,电视台经过的路线都有一定费用,求电视台不损失的情况下最多给多少用户发送信号. 分析:问题与以i为根节点的子树所包含的叶子数 #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include <stack> #include <cstdio> #in…
设d(u, j, 0)表示在以u为根的子树中至多走k步并且最终返回u,能吃到的最多的苹果. 则有状态转移方程: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; + ; + ; int n, k; int a[maxn]; ]; vector<int>…
这道题可以和POJ 2486 树形背包DP Apple Tree比较着来做. 参考题解 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <vector> using namespace std; + ; int n, Q; vector<int> G[maxn], C[maxn]; ], cnt[maxn];…
题目链接: http://poj.org/problem?id=1155 题目大意:电视台转播节目.对于每个根,其子结点可能是用户,也可能是中转站.但是用户肯定是叶子结点.传到中转站或是用户都要花钱,如果是用户,则还可以收钱.问在不亏本的前提下最多能有多少个用户看到节目. 解题思路: 比较麻烦的树形背包.首先cost=1. 花的钱权在边,收的钱权在点,且是叶子结点.所以首先可以对叶子结点进行预处理. 用dp[i][j]表示在i点时传播j个用户(包含自身),则dp[n-m-1~n][1]=每个用户…