一个人正在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;
else if (n==0)
return 1;
如果剩余步骤数与用户尝试执行的可用步骤数匹配,则可能是组合。因此,返回1,因为这是可能的组合,应将其添加到有效组合的总数中。
else if (map[n]>-1) return map[n];
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]