摘要:当子问题的数量不多时,通常我们能够比较清晰地求出最优解的结构,然后理清各种状态之间转移的过程。但是,如果一个动态规划拥有多个子结构时,我们往往会觉得无从下手,面对这种情况,我们可以考虑下枚举子结构,然后得到动态规划的最优解。而且,有时候我们在枚举子结构时,还要运用另外一些最优结构。我们看看下面几个例子。1.hdoj 1584 蜘蛛牌我们定义dp[i][j]表示从牌的大小为i到牌的大小为j这一串牌,通过移动得到满足条件的一堆牌的最小步数。对于牌1来说,他必须移到到2的上面,但是我们不知道,当他移到2位置上时2到底在哪,所以我们可以枚举2的位置。这样我们就得到了状态转移方程:dp[1][10] =
阅读全文
摘要:转载自 以太论最终编辑 以太论树形DP http://acm.hdu.edu.cn/showproblem.php?pid=2196向下搜一遍,向上搜一遍http://acm.hdu.edu.cn/showproblem.php?pid=1561 对每一个节点进行一次背包,好题啊,两个DP树形和背包结合的http://acm.hdu.edu.cn/showproblem.php?pid=1011这道是当年省赛的压轴题,但是感觉和上一道差不多,一样的难度,唯一不同的就是这个是无向图(我由于思维惯性拿来当单向图作,纠结了好久。。。) 树形+背包+临街表下边是从天涯空间里找出来的练习http://a
阅读全文
摘要:1.hdoj 1520 Anniversary party在父亲与儿子之间状态转移#include <iostream>#include <vector>using namespace std;struct Node { int choose, unchoose; int max() { return choose > unchoose ? choose : unchoose; }}ns[6005];vector<int> vec[6005];int n;void treeDP( int father ) { int i, sz, son; sz =
阅读全文
摘要:hdoj 1693Eat the Trees解题报告详见:http://hi.baidu.com/fqq11679/blog/item/423bcd4a3d956bf983025c6d.html考虑本题规模较小,处理的方式是逐格递推的状态压缩DP。 如上图,我们用F[i,j,k]表示轮廓线在i行j列出外凸,轮廓线状态为k的方案数。 这里k是一个c+1位二进制数,1表示轮廓线第i个单元有插头,0表示没有。 那么转移就考虑两种,第一种是换行,这个就要把k先右移一位,然后把k 的前两位转移成凸起,更新F[i+1,1,k']。 第二种就是直接右推一格,这个就是直接在k中找出凹角对应的两位数,转
阅读全文
摘要:动态规划:利用问题的最优性原理,以自底向上的方式,从子问题的最优解,逐步构造出整个问题的最优解。1.HDOJ 1864 最大报销额0 1 背包,范围内的最大值i从0到最后递推,每次dp[ i ] = max( dp[ j ] )+fapiao[ i ]) ;0 =< j < i;代码 1#include <iostream> 2#include <cstdio> 3#include <cstring> 4using namespace std; 5 6double limit; 7double fapiao[35], dp[35]; 8 9int
阅读全文