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

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];
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值