1

一个孩子正在跑上 n 步的楼梯,一次可以走 1 步、2 步或 3 步。现在编写一个程序来计算孩子可以用多少种可能的方式跑楼梯。

解决方案看起来像这样(DP可以用来节省时间)

public static int countDP(int n) {
 if (n<0)
   return 0;
 else if (n==0)
   return 1;   
 else {
   map[n] = countDP(n-1) + countDP(n-2) + countDP(n-3);
 return map[n]; }
}

现在的问题是如何获得这些路径?例如对于 n=4,此函数返回 7,如何获取所有可能的路径?(在这个例子中 1111 - 121 - 112 - 211 - 31 - 13 - 22 )有没有办法通过改变当前程序来做到这一点?

这不是一个家庭作业问题,它来自破解编码面试书的递归和动态编程一章 - 第 9 章 - 问题 1。

4

1 回答 1

0

是的,有一些方法可以找到所有路径,这些路径可以实现到您现有的代码中。首先,这在空间方面将非常昂贵。即使对于 n=4,您也需要创建 7 个路径。

我认为,最好的方法是创建一个三叉树并分配路径可以到达每个子节点的每种可能方式。所以,这是一个简单的伪代码:

root.value = 0;
root.left.value = 1;
root.middle.value = 2
root.right.value = 3;

然后,当您进行递归时,您会将每个孩子传递给适当的递归调用。

您需要处理一些极端情况。另外,考虑到您正在使用递归,请考虑应该在哪里定义此三叉树。

注意:我不想发布实际代码或给出完整答案,因为有几个人(包括我自己)认为这可能是一个家庭作业问题。正因为如此,我试图帮助解决这个问题并引导这个人找到解决方案,而不仅仅是分发它。

于 2013-10-27T15:33:54.987 回答