• 剑指 Offer 10- I. 斐波那契数列


     一道最最基础的题目,但我想借这个题目比较一下动态规划和递归

    class Solution {
        public int fib(int n) {
            int[] dp=new int[n+1];//从0到n
            if(n==0)
            {return 0;}
            else if(n==1)
            {return 1;}//数组越界问题
            dp[0]=0;
            dp[1]=1;
            for(int i=2;i<n+1;i++)
            {
                dp[i]=(dp[i-1]+dp[i-2])% 1000000007;
            }
            return dp[n];
    
    
        }
    }

    注意数组越界问题

    递归法所产生的重复计算:

    动态规划法时间复杂度On,空间复杂度还可以相应的简化为o1

    很多能描述递归流程的问题都可以用动态规划解决。但动态规划也有一定的局限性。

    动态规划的实质是记忆(这很重要,但网络上的绝大多数资料都没有关注这一点)。
    所以,它需要问题满足两个性质

    • 可以记忆,这就是无后效性
    • 需要记忆,即记了以后有好处,这就是重叠子问题


    而由这两个要求就能确定问题是否可以使用动态规划

    1. 解决后效性的主要方法是增加记忆数组维数,但相应带来的问题是存储空间不够(尽管通过覆盖数据等措施,仍可以用 DP 解决,但这样做会很麻烦,并且这也要求找出子问题之间的逻辑关系,即将动规写成递推形式)
    2. 更常见的情况是,问题没有或几乎没有重叠子问题,这样就不需要使用动态规划了。因为即使记忆了,这些数据也没有用武之地
  • 相关阅读:
    函数二
    python控制台输出带颜色的文字方法
    is 和 == 的区别
    基本数据类型(dict)
    基本数据类型(list,tuple)
    基本数据类型(int,bool,str)
    Python运算符与编码
    Java并发编程:synchronized
    泛型中? super T和? extends T的区别
    java中的匿名内部类总结
  • 原文地址:https://www.cnblogs.com/take-it-easy/p/14447877.html
Copyright © 2020-2023  润新知