当前位置:   article > 正文

OJ题目8--动态规划问题_oj8

oj8

1,​​​​​​509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)

过去一直用递归法,但由于栈区空间的限制,当递归过深时容易发生栈溢出。

  1. int fib(int n)
  2. {
  3. if(n==0)
  4. {
  5. return 0;
  6. }
  7. else if(n==1)
  8. {
  9. return 1;
  10. }
  11. else
  12. {
  13. return fib(n-1)+fib(n-2);
  14. }
  15. }

动态规划法:

  1. int fib(int n)
  2. {
  3. int arr[31]={0,1};
  4. for(int i=2;i<=n;i++)
  5. {
  6. arr[i]=arr[i-1]+arr[i-2];
  7. }
  8. return arr[n];
  9. }

斐波那契数列的递归法和动态规划法。动态规划:随时计算随时记录数据,后面的计算也就可以随时拿出数据来用,相比于递归,省去了许多重复的计算。

2,​​​​​​746. 使用最小花费爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)

给出一个数组,数组中的每一个元素代表登上该数对应的台阶需要的花费,可以从第0或1级台阶开始爬楼梯,从每一级台阶可以向上攀登1或2级。要求爬到楼梯顶所需要的最少花费。

本题可以这样思考,爬到第i级的花费等于从第(i-1)级向上爬1级或者从第(i-2)级向上爬两级。而为了获得爬到第(i-1)级和第(i-2)级所需要的花费,则需要借助前面的数据。因此,除了第0,第1级台阶之外,爬到任何一级台阶都需要有一定的花费,而这些花费都是可以从最开始就开始计算的。分析到这里,这个问题就是典型的动态规划问题,可以创建一个数组,实时记录计算出的爬到每一级台阶所需要的花费,然后前面记录下来的花费又可以作为后面想要求出的花费的基础。

  1. int minCostClimbingStairs(int* cost, int costSize)
  2. {
  3. int arr[1001] = { 0 };
  4. for (int i = 2; i <= costSize; i++)
  5. {
  6. arr[i] = ((arr[i - 1] + cost[i - 1])< (arr[i - 2] + cost[i - 2])?(arr[i - 1] + cost[i - 1]):(arr[i - 2] + cost[i - 2]));
  7. }
  8. return arr[costSize];
  9. }

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号