摘要: 这题和POJ1947类似, 同样是树形DP, 就是因为按照上题的思路写, 导致写的是非常的蛋疼. 调了几小时还是无果. 时候证明还是对状态的意义理解的不透彻.设dp[x][0][j]表示以节点x为根至多走j步并且返回x处所能够得到的最多苹果. dp[x][1][j]表示以节点x为根至多走j步不需要返回x处所能够得到的最多苹果.那么就可以得到动态转移方程(此时的dp[x][..][j]还没有完善, 需要后期处理一下):dp[x][0][j] = max( dp'[x][0][j-m] + dp[v][0][m] ); 0<=m<=j 其中dp'表示计算到上一个孩子节点 阅读全文
posted @ 2013-01-17 22:55 沐阳 阅读(318) 评论(0) 推荐(0) 编辑
摘要: 这题在yefeng1627的淫威下迅速屈服. 由刚开始的一个较动态方程便很好的解决了组合问题, 再加之进一步分析, 将本来应该要的辅助状态删除, 剩下的就是一个非常优美的动态规划方程了.详见代码:#include <cstdlib>#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>#define INF 0x3f3f3f3fusing namespace std;/*题意:给定一棵树, 现在要求从这棵树中分割出P个节点的子树, 问最少要破 阅读全文
posted @ 2013-01-17 15:21 沐阳 阅读(374) 评论(0) 推荐(0) 编辑
摘要: 这题有两种解法, 一种是通过动态规划弥补一个不太成熟的贪心思路, 使得最后的结果正确. 另一种方法是构造一个更好的贪心策略.动态规划依托的结论: 每次给齐王最强的马匹配一匹田忌的马, 那么这匹马不是田忌最强的马就是最弱的马, 这一个不完善的贪心策略. 所以动态规划佐之.#include <cstdio>#include <cstring>#include <cstdlib>#include <algorithm>#include <iostream>using namespace std;/*解法:开设状态dp[i][j]表示田忌出了 阅读全文
posted @ 2013-01-17 11:31 沐阳 阅读(647) 评论(0) 推荐(0) 编辑