码迷,mamicode.com
首页 > 其他好文 > 详细

动态规划优化过程

时间:2018-03-18 21:37:15      阅读:138      评论:0      收藏:0      [点我收藏+]

标签:楼梯   span   情况   body   contain   结构   递归   contains   空间   

题目:走10层楼梯,每步只能走1或2步

1:
将每次的进行排列组合:2的10次幂

2:

最后差一步到第10层的有几种情况?从9到10或从8到10,2种情况
这样假设0到9走法有X种,0到8走法是Y种,0到10有X+Y,因为最后一次是固定的。

 

问题建模:
F(10) = F(9) + F(8), 同理 F(9) = F(7) + F(8)
边界:F(1)= 1; F(2)= 2;
最优子结构,状态转移:F(n) = F(n-1) + F(n-2) (n>=3)

求解问题:

//时间复杂度O(2^n)
//递归:
int getclimbWays(int n){
    if (n < 1) {return 0}
    if (n == 1) {return 1}
    if (n == 2) {return 2}
        return getclimbWays(n -1) + getclimbWays(n -2);
}

1)优化时间复杂度

//建立哈希表:备忘录算法
//时间复杂度:n, 空间复杂度:n
int getclimbWays(int n, HashMap<Integer, Integer> map){
    if (n < 1) {return 0}
    if (n == 1) {return 1}
    if (n == 2) {return 2}
    if (map.contains(n)){
        return map.get(n);
    }else{
        int value =  getclimbWays(n -1) + getclimbWays(n -2);
        map.put(n, value);
        return value;
    }    
        
}

2)优化空间复杂度,自底向上求解,只要保留2个状态

// 动态规划
int getclimbWays(int n, HashMap<Integer, Integer> map){
    if (n < 1) {return 0}
    if (n == 1) {return 1}
    if (n == 2) {return 2}
        
    int a = 1;
    int b = 2;
    int temp = 0;

    for(int i = 3; i <= n; i++){
        temp = a + b;
        a = b;
        b = temp;
    }

    return temp;
        
}

 

动态规划优化过程

标签:楼梯   span   情况   body   contain   结构   递归   contains   空间   

原文地址:https://www.cnblogs.com/xiexiaoxiao/p/8597307.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!