【问题标题】:Find maximum amount of gold that can can be collected from a grid找到可以从网格中收集的最大数量的黄金
【发布时间】:2015-09-23 19:37:45
【问题描述】:

给定一个 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 并且 dp[i][j]=0 表示 i=m

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

【问题讨论】:

    标签: algorithm recursion dynamic-programming


    【解决方案1】:

    d[i][j]
    

    是从位置(i,j)开始,只向右、向上和向下移动,对于任何i in [0..m-1]j in [0..n-1],可以获得的最大金币数量。我们得到以下递归关系,从某种意义上说,访问[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
                            }
    

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

    【讨论】:

    • 如果其中两个移动是右上和右下,我希望在某处看到一个减号。
    • 为什么不能从右上角开始,或者最右边一列的任何地方?
    • @ScottHunter 你可以;我的解释完全是误导性的,我希望它现在已经修复了,
    • 因为您可以从任何行开始,所以最佳可能不会d[0][0]
    猜你喜欢
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多