当前位置:   article > 正文

代码随想录算法训练营第三十八天|509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

代码随想录算法训练营第三十八天|509. 斐波那契数 ● 70. 爬楼梯 ● 746. 使用最小花费爬楼梯

前几道题属于是摸索,都是照葫芦画瓢,从第三题开始写一些自己的心得


746. 使用最小花费爬楼梯 


随想录文字讲解:代码随想录 (programmercarl.com)

随想录视频讲解:动态规划开更了!| LeetCode:746. 使用最小花费爬楼梯_哔哩哔哩_bilibili

状态:做出来了


在写题之前,先看了左神的关于一维动态规划的一些视频。视频中对于一维动态规划的学习可以分为这样的渐进:

先是使用递归暴力的写出来。

然后因为递归中有很多重复计算,就写一个表来存储已经被计算过的数值,这样递归的第一条o(n)深度的从底顶就已经把基本后续需要的值给存到表里了。

这是从底到顶的记忆化动态规划。

底部的数据依赖其前部,所以有从顶到底的动态规划,也就是随想录的分析做法。

三种代码如下:

这个会超时(无记忆)

  1. class Solution {
  2. public:
  3. int digui(vector<int>& cost,int i)
  4. {
  5. if(i<=1) return 0;
  6. return min(digui(cost,i-1)+cost[i-1],digui(cost,i-2)+cost[i-2]);
  7. }
  8. int minCostClimbingStairs(vector<int>& cost)
  9. {
  10. int n=cost.size();
  11. return digui(cost,n);
  12. }
  13. };

记忆化:

  1. class Solution {
  2. public:
  3. int digui(vector<int>& cost,int* arr,int i)
  4. {
  5. if(i<=1) return 0;
  6. if(arr[i]!=-1)
  7. return arr[i];
  8. int res=min(digui(cost,arr,i-1)+cost[i-1],digui(cost,arr,i-2)+cost[i-2]);
  9. arr[i]=res;
  10. return res;
  11. }
  12. int minCostClimbingStairs(vector<int>& cost)
  13. {
  14. int n=cost.size();
  15. int arr[n+1];
  16. memset(arr,-1,sizeof(arr));
  17. return digui(cost,arr,n);
  18. }
  19. };

从顶到底

  1. class Solution {
  2. public:
  3. int minCostClimbingStairs(vector<int>& cost)
  4. {
  5. int n=cost.size();
  6. int dp[n+1];
  7. dp[0]=0;
  8. dp[1]=0;
  9. for(int i=2;i<=n;i++)
  10. dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
  11. return dp[n];
  12. }
  13. };

空间上还可以再优化,让dp数组只有两个长度。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/码创造者/article/detail/756708
推荐阅读
相关标签
  

闽ICP备14008679号