【问题标题】:Dynamic Programming Recursion动态规划递归
【发布时间】:2014-05-22 07:24:51
【问题描述】:

我有一个用 C# 编写的递归方法/函数,它可以获取超过 90 行的二维数组的最大和路径。在大约 25 行时,递归停止。我试图克服实施为斐波那契制作的示例的问题。结果是,仍然溢出但结果也是错误的。这就是我所做的,我感谢大家的任何解决方案或建议。

编辑:仍然无法处理 90 行。

static long[,] cache = new long[1000, 1000];
private long GetTotal(int row, int column, long[,] triangle, long[,] cache)
{
    if (row == 0) return triangle[row, column];

    long myValue = triangle[row, column];
    long left = myValue + GetTotal(row - 1, column, triangle, cache);
    long right = myValue + GetTotal(row - 1, column + 1, triangle, cache);

    if (cache[row, column] !=0)   
    return cache[row, column];

    cache[row, column] = Math.Max(left, right);
    return cache[row, column]; 
} 

【问题讨论】:

  • 如果实现为循环,这段代码会更快、更安全、更易读。那么递归到底实现了什么?
  • 获取二维数组中三角形的最大路径和。

标签: c# arrays recursion dynamic-programming


【解决方案1】:

你不应该只基于行缓存,你应该基于行和列缓存。

您的代码现在为行存储一个值,而不是为每行存储多个值,并且为每个(行、列)组合存储一个值。

缓存的“键”应该是(行,列)。它可以使用 2D 矩阵来解决 - 尽管它可能比 Dictionary 更广泛(在权重方面)。

【讨论】:

  • 到目前为止,你是唯一知道在说什么的人。#
  • 我使用数组是因为我尝试在斐波那契上使用一个示例,但仍在努力实现 Dictionary。
  • 我刚刚做了一些其他更改,但仍然无法处理 90 行。
  • 在您之前的字典示例中,您使用了 Pair,它应该是一个类。还有另一种不使用创建类的方法吗?另外,如果我设法使它与二维数组一起工作,我可以用字典替换它。
  • @Orazio 关键是您需要一对作为密钥。它也可以通过获取dictionary.get(row).get(column)Dictionary<int,Dictionary<int,long>> 一起使用(我个人更喜欢Tuple,但这只是我)> 您也可以使用二维数组 - 但如果不小心操作可能会占用更多空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-26
  • 2013-11-14
  • 2012-07-10
  • 2011-11-09
  • 2020-11-20
  • 2013-10-09
  • 2021-06-01
相关资源
最近更新 更多