一个人正在n步的阶梯上奔跑,一次可以走1步,2步或3步。现在编写一个程序,计算孩子上楼梯的可能方式。
给出的代码如下
public static int countDP(int n, int[] map) {
if (n<0)
return 0;
else if (n==0)
return 1;
else if (map[n]>-1)
return map[n];
else {
map[n] = countDP(n-1, map) + countDP(n-2, map) + countDP(n-3, map);
return map[n]; }
}
我知道C和C ++,而不是JAVA。这来自《破解编码》采访书。任何人都可以解释
她为什么以及如何在此处使用功能图?这里的映射是数组吗?
我看不到任何将输入保存到map数组的行,但是它将如何返回某些内容?
有人对此代码的C ++或C版本有想法吗?很难理解此代码。也许不是因为JAVA语法,而是因为动态编程的隐式结构。
该算法的时间复杂度是多少?它应该小于O(3 ^ n)吗?
我将不胜感激。
多谢你们
好的,这就是代码的作用。
`if (n<0)`
`return 0;`
如果没有足够的剩余步骤,则不要计算。例如,如果还剩下两个步骤,但是用户尝试执行三个步骤,则它不算作可能的组合。
else if (n==0)
return 1;
如果剩余步骤数与用户尝试执行的可用步骤数匹配,则可能是组合。因此,返回1,因为这是可能的组合,应将其添加到有效组合的总数中。
else if (map[n]>-1)
return map[n];
这是动态编程部分。假定数组中的所有值的值为-1。因此,如果该数字大于-1,则说明已经解决了该问题,因此请从步骤号n返回组合的总数,而不是对其进行求解。
`map[n] = countDP(n-1, map) + countDP(n-2, map) + countDP(n-3, map);`
return map[n]; }
最后,这部分解决了代码。可能组合的数量等于用户迈出1步可获得的可能组合数量+用户迈出2步可获得的可能组合数量+用户迈出可获得的可能的组合数量三个步骤。
例如,假设有5个步骤
一个简单的运行看起来像:
//The number of solutions from the fifth step
countDp(5) = countDp(4)+countDp(3)+countDp(2);
//Number of solutions from the fourth step
countDP(4) = countDp(3)+countDp(2)+countDp(1);
//Number of solutions from the third step
countDp(3) = countDp(2)+countDp(1)+countDp(0);
//Number of solutions from the second step
countDp(2) = countDp(1)+countDp(0)+countDp(-1);
//Number of solutions from the first step
countDp(1) = countDp(0) + countDp(-1)+countDp(-2);
//Finally, base case
countDp(0) = 1;
countDp(-1)= 0;
countDp(-2)= 0;
countDp(1) = 1+0+0 = 1;
countDp(2) = 1+1+0 = 2; //Dynamic programming: did not have to resolve for countDp(1), instead looked up the value in map[1]
countDp(3) = 2+1+1 = 4; //Dynamic programming, did not have to solve for countDp(1), countDp(2), instead looked up value in map[1] and map[2]
countDp(4) = 4+2+1=7 //Dynamic programming, did not have to solve for CountDp(3),CountDp(2), CountDp(1), just looked them up in map[3],map[2],map[1]
countDp(5)= 2+4+7=13 //Dynamic programming, just used map[4]+map[3]+map[2]
1. Introduction:DP(Dynamic Programming) 定义 解决复杂问题的一种方法。将多阶过程分解为一些列单阶段问题,逐个求解,最后结合起来以解决这类过程优化问题。 同时,将这些子问题的解保存起来,如果下一次遇到了相同的子问题,则不需要重新计算子问题的解。 DP主要用于解决含有以下两点特性的问题 最优子结构:最优解能被分解为子问题,最优应用原则 覆盖子问题:子问题多次出现
本文向大家介绍JavaScript动态编程,包括了JavaScript动态编程的使用技巧和注意事项,需要的朋友参考一下 动态编程将问题分解为越来越小的可能的子问题。这些子问题不是独立解决的。相反,这些较小的子问题的结果将被记住并用于相似或重叠的子问题。 在有问题的地方使用动态编程,可以将其分为相似的子问题,以便其结果可以重复使用。通常,这些算法用于优化。在解决现有子问题之前,动态算法将尝试检查先前
动态编程方法类似于将问题分解为更小但更小的子问题的分而治之。 但不同的是,分而治之,这些子问题并没有独立解决。 相反,记住这些较小子问题的结果并用于类似或重叠的子问题。 动态编程用于我们遇到问题的地方,可以将其划分为类似的子问题,以便可以重复使用它们的结果。 大多数情况下,这些算法用于优化。 在解决现有子问题之前,动态算法将尝试检查先前解决的子问题的结果。 结合子问题的解决方案以实现最佳解决方案。
我是一个初学者,我正在尝试用动态编程方法编写一个旅行推销员问题。 这是我的计算函数的代码: 代码没有给我正确的答案,我试图找出错误发生在哪里。我想我的错误发生在我添加:< code>distCur = compute(newSet,unvisitedSet[I])dist MTX[unvisitedSet[I]][dest]的时候;所以我一直在摆弄这一部分,在返回< code>distMin之前,
问题内容: 在过去的两年中,我一直在编写Java,现在,我开始用python(另外)进行编写。 问题是,当我查看我的Python代码时,似乎有人试图将Java代码转换为python格式,但结果却很糟糕,因为- python不是Java。 关于如何摆脱“用Python编写Java”模式的任何技巧? 谢谢! 问题答案: 您可能会考虑将自己沉浸在Python范例中。最好的方法是先了解他们的知识,然后通过
问题内容: 我在弄清楚动态硬币更换问题的最后代码方面遇到麻烦。我已包含以下代码。 我不知道最后一个。那时候应该只使用贪婪算法,还是可以根据表中已有的值计算答案?我一直在努力理解这个问题,我认为我已经很接近了。该方法通过创建表并使用存储在表中的结果来解决较大的问题而无需使用递归来找到进行一定量更改所需的最小硬币数量。 问题答案: 您不需要切换到贪婪算法来解决硬币兑换问题,您可以使用动态编程算法来解决