n steps with 1, 2 or 3 steps taken. How many ways to get to the top?

前端 未结 13 830
时光说笑
时光说笑 2020-12-08 08:12

If we have n steps and we can go up 1 or 2 steps at a time, there is a Fibonacci relation between the number of steps and the ways to climb them. IF and ONLY if we do not co

13条回答
  •  时光取名叫无心
    2020-12-08 08:50

    Here is an O(Nk) Java implementation using dynamic programming:

    public class Sample {
        public static void main(String[] args) {
            System.out.println(combos(new int[]{4,3,2,1}, 100));
        }
    
        public static int combos(int[] steps, int stairs) {
            int[][] table = new int[stairs+1][steps.length];
            for (int i = 0; i < steps.length; i++) {
    
                for (int n = 1; n <= stairs; n++ ) {
                    int count = 0;
                    if (n % steps[i] == 0){
                        if (i == 0)
                            count++;
                        else {
                            if (n <= steps[i])
                                count++;
                        }
                    }
    
                    if (i > 0 && n > steps[i]) {
                        count += table[n - steps[i]][i];
                    }
    
                    if (i > 0)
                        count += table[n][i-1];
    
                    table[n][i] = count;
                }
            }
    
            for (int n = 1; n < stairs; n++) {
                System.out.print(n + "\t");
                for (int i = 0; i < steps.length; i++) {
                    System.out.print(table[n][i] + "\t");
                }
                System.out.println();
            }
            return table[stairs][steps.length-1];
        }
    }
    

    The idea is to fill the following table 1 column at a time from left to right:

    N    (4)    (4,3)  (4,3,2) (4,3,2,1)
    1   0   0   0   1   
    2   0   0   1   2   
    3   0   1   1   3   
    4   1   1   2   5   
    5   0   0   1   6   
    6   0   1   3   9   
    7   0   1   2   11  
    8   1   1   4   15  
    9   0   1   3   18  
    10  0   1   5   23  
    11  0   1   4   27  
    12  1   2   7   34  
    13  0   1   5   39  
    ..
    ..
    99  0   9   217 7803
    100             8037
    

提交回复
热议问题