找到可以从网格中收集的最大金量

时间:2015-09-23 19:37:45

标签: algorithm recursion dynamic-programming

给定m * n大小的网格。网格中的每个块都有一定量的金。

我们从网格的第一列(任何一行)开始,我们只能在3个方向上移动 - 右,右上(左对角)和右下(右对角)。

我们可以从网格中收集的最大金额是多少。

我尝试使用具有以下递归关系的动态编程

dp [i] [j] = max {a [i-1] [j + 1],a [i] [j + 1],a [i + 1] [j + 1]} + a [ i] [j] j = 0到n-1 并且对于i< 0或i> = m

,dp [i] [j] = 0

这会给出正确和最佳的答案吗?

1 个答案:

答案 0 :(得分:1)

d[i][j]

对于任何(i,j)i in [0..m-1],只能通过向右移动,向右移动和向右移动,从位置j in [0..n-1]开始,可以获得最大金额。我们获得了以下递归关系,这意味着在senese中读取[0..m-1][0..n-1]之外的坐标的访问意味着返回0

d[i][j] = a[i][j] + max { d[i  ][j+1], // right
                          d[i-1][j+1], // right up
                          d[i+1][j+1]  // right down
                        }

此处的问题是使用评估序列,d表达式中出现的max的每个所需值都可用于评估d[i][j]。评估顺序必须从最右边的列开始,为每个d[i][n-1] = a[i][n-1]设置i in [0..m-1].。状态必须从右到左按列填充;评估后,最佳金量是最左列中出现的最大值。