我必须获得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);
}
答案 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];
}