数字三角形
描述:
有一个像这样的数字三角形:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
从顶点开始,每个数字向下层走只能有左下和右下两个方向,求出到达最后一行时的最大路径之和.
今天从一本acm算法书看到的。题目不算难,但书里写的东西不错。解释在动态规划中,你所定义的状态很关键。同一个问题如果你定义的状态不同,你所得的状态转移方程自然不同。这有点废话。可严重的是,如果状态没定义好的话,甚至你根本用不了动态规划。因为你定义的状态根本不满足动态规划的基本要求:最优子问题,无后效性。所以这其实也是卡住很多人的地方。每次看这些题目的时候,总隐隐地觉得它满足最优子问题,甚至你也知道这个最优子问题的划分,可是你未必找得到状态转移方程。因为事实上你的状态并没有真正定义好。(划分阶段相对容易,这里就不论述了)
例如:以上的题目,显然可以通过层划分。从顶点开始,逐层的向下走。
状态一:如果定义的状态为,若为X层,其状态为D(X)为顶层到X层的最大路径之和。D(X)为最大,则D(X-1)为顶层到X-1层的最大。当事实并不成立。如上图D(3)=18, 7-3-8;而D(2)=15 7-8, D(3)的路径根本没有包含D(2)路径。
状态二:若为X层,定义状态D(X,j)为顶层到第X的层第j的节点的最大路径之和。D(X,j)为D(X-1,j)和D(X-1,j-1)的最大加上节点j的值。对于一个数字(数字I),到达它的最优路线的最后一步可以是上或左上。不妨假设最后一步是上,那么到达下方数字(数字II)的路径也必须最优。可以 用“剪贴”方法证明这一点:如果到达数字II的路径非最优,那么可以改进路径使数字II的路径更优,这样到达数字I的路径还可以更优,与原先假设数字I路 线已经最优矛盾。所以到达数字II的路径必为最优。转移方程:D(X,j)=max{D(X-1,j],D(i-1,j-1]}+a[i,j]
状态三:状态二是自顶向下的,那么也可以自底向上思考。定义状态D(X,j)为底层到第X的层第j的节点的最大路径之和。最终的结果为D(1,1)了。同理这个可以证明它是满足动态规划的基本条件的。
其实动态规划的思想很灵活,很需要想象力。有时从某一个角度思考想不出来如何下手,不妨可以试试其他。当然也要建立在你深刻的理解动态规划的思想,否则连最简单的证明都没有,如何肯定你是在用动态规划来解题呢?而且题目本身能不能使用动态规划都是个问题,它又没有告诉你一定要使用动态规划解题。至此,写小小的思考而已。
PS:没带简历,没法被网易藐视了。。。
昨天以被搜狐藐视了。。。。
继续好好复习,九月份后还是条好汉。。。
一首<领悟>
...啊~多么痛得领wu...