使用巨大的2d数组获取Max Path Sum递归

时间:2014-04-08 12:19:28

标签: c# algorithm multidimensional-array

我必须获得2d数组的最大路径总和 我可以设法最多获得40行,但是在函数没有返回任何值之后 有人能帮我吗?

private int GetTotal(int row, int column, int[,] triangle)
{
    if (row == 0) return triangle[row, column];

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

    return Math.Max(left, right);
} 

2 个答案:

答案 0 :(得分:1)

您正在观察算法的指数运行时间。该算法在O(2^rows)中运行 - 这是一个非常大的数字。

考虑将代码转换为Dynamic Programming解决方案,这基本上是实现此类递归的有效方法,而无需计算两次值(代码中就是这种情况)。

最简单的方法是自上而下动态编程,也称为"memorization"
只需添加一个字典,我们称之为cache,并在函数的开头 - 检查(行,列)是否在缓存中。如果是 - 只返回已经计算的值。
否则 - 计算值,在返回之前 - 将其存储在cache

根据您的代码,这是伪代码。它不会编译 - 但它应该证明手头的问题。

private long GetTotal(int row, int column, Pyramid pyramid, Dictionary<Pair<int,int>,long> cache)
{
    if (row == 0) return pyramid[row, column];
    //add a check if you already calculated for this row and column:
    Pair<int,int> p = new Pair<int,int>(row,column);
    if cache.ContainsKey(p) return cache.Get(p);

    int myValue = pyramid[row, column];
    long left = myValue + GetTotal(row - 1, column, pyramid, cache); //sending the dictionary as well...
    long right = myValue + GetTotal(row - 1, column + 1, pyramid, cache);

    long best = Math.Max(left, right);
    //before returning: store the just calculated value in the cache:
    cache.Add(p,best);
    return best;
} 

答案 1 :(得分:1)

嗨,阿米特这就是我所做的,但现在实际上更糟糕了。现在溢出发生在25行,而在编辑40行之前。

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

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

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

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