CTCI上的动态编程解决方案9.1

时间:2016-05-21 14:48:40

标签: java algorithm dynamic-programming

我最近正在研究CTCI,并对第9.1项问题的解决方案有一些疑问。我认为解决方案可能是错误的。

问题是

  

一个孩子在n级台阶上跑步,可以一步跳一步,两步或三步。实施一种方法来计算孩子爬楼梯的可能方式。

给出的解决方案是here

public class Question {

    public static int countWaysDP(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] = countWaysDP(n - 1, map) + 
                     countWaysDP(n - 2, map) + 
                     countWaysDP(n - 3, map);
            return map[n];
        }
    }

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

    public static void main(String[] args) {
        for (int i = 0; i < 30; i++) {
            long t1 = System.currentTimeMillis();
            int[] map = new int[30 + 1];
            for (int j = 0; j < map.length; j++) {
                map[j] = -1;
            }
            int c1 = countWaysDP(i, map);
            long t2 = System.currentTimeMillis();
            long d1 = t2 - t1;

            long t3 = System.currentTimeMillis();
            int c2 = countWaysRecursive(i);
            long t4 = System.currentTimeMillis();
            long d2 = t4 - t3;          
            System.out.println(i + " " + c1 + " " + c2 + " " + d1 + " " + d2);
        }
    }

}

在上面的解决方案中,当countWaysDP(int n, int[] map)给定整数1时,它将返回-1,而不是返回1。因为程序将转到分支(map[n] > -1),它将返回map[n]map[1]-1,因为它已初始化。

0 个答案:

没有答案