剑指 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. 更常见的情况是,问题没有或几乎没有重叠子问题,这样就不需要使用动态规划了。因为即使记忆了,这些数据也没有用武之地
原文地址:https://www.cnblogs.com/take-it-easy/p/14447877.html