台阶问题---动态规划算法

问题描述

  所谓的台阶问题就是说,从0开始上台阶1,2,3...n,每次只能上1个或者2个台阶。问上到n个台阶有多少种走法。这个问题是比较典型的,也有很多种变形,我们先讲解下这种的实现。

问题分析

  我们先按照举例来分析,我测试了下,6个台阶时候的变化,如下个表 

台阶数 走法数
1 1
2 2
3 3
4 5
5 8
6 13

这特别像是一个斐波那契数列,那我们想下,如果有10阶台阶,那么我们往后倒推,10阶台阶肯定是第九个台阶和是第八个台阶上来的,那第九个台阶肯定是第八个台阶和第七个台阶上来的,第八个台阶肯定是第七个台阶和第六个台阶上来的,同理,我们得出了f(n)=f(n-1)+f(n-2)  

代码实现

 /**
     * 动态规划算法,f(n)=f(n-1)+f(n-2)
     * @param n
     * @return
     */
    private int getSolution(int n){
        if(n < 0){
            return -1;
        }
        if(n == 0){
            return 0;
        }
        if(n == 1){
            return 1;
        }
        int a = 1;
        int b = 1;
        int fn = 0;
        for(int i = 2; i < n+1; i++){
            fn = a + b;
            b = a;
            a = fn;
        }
        return fn;
    }

问题延伸

  如果台阶问题变化一下,如果台阶随意可以上,可以上1个,2个,3个.....n个,那么n个台阶的话,有多种走法呢?

  我们来分析一波,按照上面说的,10个台阶,可以由第九个,八个,七个.......一个台阶都可以上来,那么第九个台阶可以由第八个,七个,六个.....一个台阶都可以上来,同理我们得出,

  f(n)=f(n-1)+f(n-2)+.......+f(4)+f(3)+f(2)+f(1)

  f(n-1) = f(n-2) +f(n-3) +........+f(4)+f(3)+f(2)+f(1)

  经过上面两个算式,我们可以得出,f(n)=2f(n-1)

  代码实现

 1  /**
 2      * 动态规划算法,
 3      *    f(n)=2f(n-1)
 4      * @param n
 5      * @return
 6      */
 7     private int getDoubleTree(int n){
 8         if(n < 0){
 9             return -1;
10         }
11         if(n==0){
12             return 0;
13         }
14         if(n==1){
15             return 0;
16         }
17         int a = 1;
18         int fn = 0;
19         for(int i = 2; i < n + 1; i++){
20             fn = 2*a;
21             a = fn;
22         }
23         return fn;
24     }

  

原文地址:https://www.cnblogs.com/lixiaochao/p/10025839.html