如何用动态规划定义球体金字塔的递推公式?

时间:2016-10-16 21:54:38

标签: algorithm dynamic-programming

我有这个问题:

给定如上所示的球体金字塔,其中每个球体都有一个相关的数字(正数或负数),代表其得分。玩家可以选择金字塔内的任何球体,并且总分将根据其正上方的球体计算。

玩家可以获得的最高分数是多少?

这是N = 6

金字塔的一个例子

Pyramid of level 6

游戏插图:

  • 如果玩家选择金字塔顶部的球体,总得分为:13。
  • 如果玩家在等级3选择第三个球体(值:11),则还必须移除等级为2且具有数字54和9的球体。前两个球体要求还必须移除1级的两个球体,因为它们位于球体的54上方,而球体的上方则为9.最后,必须移除具有13值的球体。总分:13 + 32 - 7 + 54 + 9 + 11 = 112。

要求:

  1. 确定从金字塔中选择球体时的总得分。
  2. 确定所有领域中可能达到的最高分数。
  3. 必须使用动态编程解决需求号1。

    解决方案:

    首先,这是问题的符号/语言:

    每个球体都用元组(i,j)表示;其中i表示级别(0<=i<=n),j是从左到右的球体位置。

    v(i,j)(i,j)0<=j<=i<=N的球体值。

    p(i,j) =“玩家选择球体时的总得分(i,j)”,1<=i<=N

    复发:

    这是我为定义递归公式所做的:

    p(i,j)=v(0,0),如果i=0

    = v(i-1, j-1) + v(i-1, j+1),如果i>0 & 0 <= j < i + 1

    如您所见,我正在尝试一些困难来指定递归公式来计算给定选定范围的分数。

    定义它的一些想法或建议?

2 个答案:

答案 0 :(得分:2)

看起来如果我们通过用前一级别p(i-1,j-1)和p(i-1,j)汇总当前值来尝试计算当前p(i,j),那么p(i-2, j-1)对左分支p(i-1,j-1)和右分支计算两次。要修复它,我们可以从结果中减去一个p(i-2,j-1):

p(i,j) = v(i,j) + p(i-1, j-1) + p(i-1, j) - p(i-2, j-1) 

答案 1 :(得分:1)

也许

p(i == 0, j == 0) = v(0,0)

p(i,j) = p(i-1, j-1) + p(i-1, j) + v(i,j), if i>0 & 0 <= j < i + 1, otherwise 0

这是因为左上角的那个是j-1,而右上角的那个是j,我们还需要添加球体值。您似乎在左上角和右上角使用了v而不是p,但我们需要继续向上并递归计算值,直到达到i>0 & 0 <= j < i + 10,0条件为止

(抱歉写得不好,需要尽快入睡,欢迎编辑)