赞
踩
1,509. 斐波那契数 - 力扣(LeetCode) (leetcode-cn.com)
过去一直用递归法,但由于栈区空间的限制,当递归过深时容易发生栈溢出。
- int fib(int n)
- {
- if(n==0)
- {
- return 0;
- }
- else if(n==1)
- {
- return 1;
- }
- else
- {
- return fib(n-1)+fib(n-2);
- }
- }
动态规划法:
- int fib(int n)
- {
- int arr[31]={0,1};
- for(int i=2;i<=n;i++)
- {
- arr[i]=arr[i-1]+arr[i-2];
- }
- return arr[n];
- }
斐波那契数列的递归法和动态规划法。动态规划:随时计算随时记录数据,后面的计算也就可以随时拿出数据来用,相比于递归,省去了许多重复的计算。
2,746. 使用最小花费爬楼梯 - 力扣(LeetCode) (leetcode-cn.com)
给出一个数组,数组中的每一个元素代表登上该数对应的台阶需要的花费,可以从第0或1级台阶开始爬楼梯,从每一级台阶可以向上攀登1或2级。要求爬到楼梯顶所需要的最少花费。
本题可以这样思考,爬到第i级的花费等于从第(i-1)级向上爬1级或者从第(i-2)级向上爬两级。而为了获得爬到第(i-1)级和第(i-2)级所需要的花费,则需要借助前面的数据。因此,除了第0,第1级台阶之外,爬到任何一级台阶都需要有一定的花费,而这些花费都是可以从最开始就开始计算的。分析到这里,这个问题就是典型的动态规划问题,可以创建一个数组,实时记录计算出的爬到每一级台阶所需要的花费,然后前面记录下来的花费又可以作为后面想要求出的花费的基础。
- int minCostClimbingStairs(int* cost, int costSize)
- {
- int arr[1001] = { 0 };
- for (int i = 2; i <= costSize; i++)
- {
- 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]));
- }
- return arr[costSize];
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。