给定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这会给出正确和最佳的答案吗?
答案 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].
。状态必须从右到左按列填充;评估后,最佳金量是最左列中出现的最大值。