动态规划优化过程

Posted xiexiaoxiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划优化过程相关的知识,希望对你有一定的参考价值。

题目:走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;
        
}

 

以上是关于动态规划优化过程的主要内容,如果未能解决你的问题,请参考以下文章

动态规划入门

动态规划算法

动态规划入门

动态规划算法

动态规划优化过程

动态规划概述