0
点赞
收藏
分享

微信扫一扫

C解OJ题--斐波那契数(动态规划系列之不划水)


一 前言
  以前书上看不懂的经典例题,在这里终于给他搞懂了。


二 原题如下
在这里插入图片描述
  斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
  F(0) = 0,F(1) = 1
  F(n) = F(n - 1) + F(n - 2),其中 n > 1
  给你 n ,请计算 F(n) 。

审题:
  这是一道典型的动态规划系列的题目,与其他动态规划类型的题目相比其直观的给出了递推公式。
  现在我们一如既往的按照动态规划的解题思想来完成对该题的解读。


三 解题步骤
一.定义dp数组所表示的含义
  解动态规划类型的题目我们都会定义一个dp(Dynamic Programming)数组,可能是一维数组,可能是二维数组,也有可能是临时变量。我们要明确数组下标所表示的含义及元素所表示的意思。
二.确定递推公式
  这一步是核心也是难点,通过最后一步和子问题来确定。
最后一步: 假设前面若干步都是最优的,那最后一步如何选择也是最优的。
子问题: 将大问题分解成若干的子问题来解决。
三.定义初始条件及边界
  有些不能用递推公式计算出来的要直观的给出答案,边界情况自然是数组不能越界。
四.遍历顺序(计算顺序)
  按照怎样的顺序去遍历计算(大->小;小->大)
遍历顺序的计算通常只有一个原则: 要计算递推公式左边的要知道递推公式右边的。


四 按步就搬
一 定义dp数组所表示的含义
  要求解输入n时的斐波那契数,那我们就定义第n的斐波那契数是dp[n]。
二 确定递推公式
  就本题而言其已经直观的给出了递推公式,但还是按照流程走一遍。
  最后一步:假设要求解dp[n],由题意现在我们已经知道了dp[n-1]与dp[n-2]的结果,那么递推公式就为:dp[n]=dp[n-1]+dp[n-2]
三 定义初始条件及边界
  由于dp[0]与dp[1]不能由递推公式计算得出,因为数组下标无负数。所以要直观得给出两者的结果。
  其次,由于要计算dp[n]所以开辟的dp数组的大小要为 n+1。
四 遍历顺序(计算顺序)
  要求解递推公式左边的要知道递推公式右边的,因为 n>n-1,所以要从小到大进行计算。


五 代码实现

//C实现
int fib(int n){
    int*dp=malloc(sizeof(int)*(n+1));//开辟dp数组
    dp[0]=0;//不能由递推公式得出的要直观的给出结果
    if(n>0)dp[1]=1;//防止数组越界操作
    for(int i=2;i<=n;i++)
    {
        dp[i]=dp[i-1]+dp[i-2];
    }
    return dp[n];
}

  


  我是老胡,感谢阅读! ❤️ ❤️

举报

相关推荐

0 条评论