【算法】动态规划练习(一)

这篇具有很好参考价值的文章主要介绍了【算法】动态规划练习(一)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【算法】动态规划练习(一),算法,动态规划,算法

目录

1137. 第 N 个泰波那契数

分析

代码

面试题 08.01. 三步问题 

分析

代码

 746. 使用最小花费爬楼梯

分析

代码



【算法】动态规划练习(一),算法,动态规划,算法


泰波那契序列 Tn 定义如下: 

T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2

给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

示例 1:

输入:n = 4
输出:4
解释:
T_3 = 0 + 1 + 1 = 2
T_4 = 1 + 1 + 2 = 4

示例 2:

输入:n = 25
输出:1389537

分析

根据题目中的Tn+3 = Tn + Tn+1 + Tn+2,可以转换为n>=3时,Tn = Tn-1+ Tn-2 + Tn-3

在求解动态规划的题目时,我们可以分为五个步骤:

1.状态表示

状态表示简而言之就是dp表里面某个值所代表的含义。

要得到dp表,基本上可以按照题目要求、做题经验、发现重复子问题三个步骤。

针对这个题目,可以根据题目要求得出,dp[i]表示第 i 个泰波那契数

2.状态转移方程

状态转移方程就是得到 dp[i] 等于什么。

这个题目中比较明显,dp[i]=dp[i-1]+dp[i-2]+dp[i-3]

3.初始化

初始化就是为了保证后续填dp表的时候不越界。

这个题目中就需要先填    dp[0]=0,dp[1]=1,dp[2]=1

4.填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了。

这个题目已经给出了前三个状态的值,所以就按照从左向右的顺序进行填表。

5.返回值

这个也是由题目要求和前面的状态表示来决定。

这个题目中就可以直接返回 dp[n]。

代码

class Solution {
public:
    int tribonacci(int n) {
        vector<int>nums(n,0);
        //初始化
        nums[0]=0;
        nums[1]=1;
        nums[2]=1;
        //填表
        for(int i=3;i<=n;i++)
        nums[i]=nums[i-1]+nums[i-2]+nums[i-3];
        return nums[n];

    }
};

面试题 08.01. 三步问题 

三步问题。有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶或3阶。实现一种方法,计算小孩有多少种上楼梯的方式。结果可能很大,你需要对结果模1000000007。

示例1:

 输入:n = 3 
 输出:4
 说明: 有四种走法

示例2:

 输入:n = 5
 输出:13

提示:

  1. n范围在[1, 1000000]之间

分析

1.状态表示

状态表示简而言之就是dp表里面某个值所代表的含义。

针对这个题目,可以根据题目要求得出,dp[i]表示到达第i个位置时,一共有多少种方法。

2.状态转移方程

这个题目要根据 i 位置的状态,最近的一步来划分问题。

【算法】动态规划练习(一),算法,动态规划,算法

3.初始化

初始化就是为了保证后续填dp表的时候不越界。

根据题干          dp[1]=1,dp[2]=2,dp[3]=4

4.填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了。

这个题目已经给出了前三个状态的值,所以就按照从左向右的顺序进行填表。

5.返回值

这个也是由题目要求和前面的状态表示来决定。

这个题目中就可以直接返回 dp[n]文章来源地址https://www.toymoban.com/news/detail-847526.html

代码

class Solution {
public:
    int waysToStep(int n) {
        long long mod=1000000007;
        vector<long long>dp(n+5);
        //初始化
        dp[1]=1,dp[2]=2,dp[3]=4;
        //填表
        for(int i=4;i<=n;i++)
        {
            dp[i]=((dp[i-1]+dp[i-2])%mod+dp[i-3])%mod;
        }
        return dp[n];
    }
};

 746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。

你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。

请你计算并返回达到楼梯顶部的最低花费。

示例 1:

输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。
- 支付 15 ,向上爬两个台阶,到达楼梯顶部。
总花费为 15 。

示例 2:

输入:cost = [1,100,1,1,1,100,1,1,100,1]
输出:6
解释:你将从下标为 0 的台阶开始。
- 支付 1 ,向上爬两个台阶,到达下标为 2 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 4 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 6 的台阶。
- 支付 1 ,向上爬一个台阶,到达下标为 7 的台阶。
- 支付 1 ,向上爬两个台阶,到达下标为 9 的台阶。
- 支付 1 ,向上爬一个台阶,到达楼梯顶部。
总花费为 6 。

分析

1.状态表示

经验+题目要求

针对这个题目,可以根据题目要求得出,dp[i]表示到达 i 位置时的最小花费。

2.状态转移方程

主要是用之前或者之后的状态来推导 dp[i] 的值。

这里根据最近的一步,来划分问题。

【算法】动态规划练习(一),算法,动态规划,算法

3.初始化

初始化就是为了保证后续填dp表的时候不越界。

根据题干          dp[1]=0,dp[1]=0

4.填表顺序

为了填写当前状态的时候,所需要的状态已经计算过了。

根据题目可以得出前两个个状态的值,所以就按照从左向右的顺序进行填表。

5.返回值

这个也是由题目要求和前面的状态表示来决定。

这个题目中就可以直接返回 dp[n]

代码

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n=cost.size();
        vector<int>dp(n+1);
        //以i位置为结尾的最小花费
        dp[0]=dp[1]=0;
        //从左往右
        for(int i=2;i<=n;i++)
        {
            dp[i]=min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);
        }
        return dp[n];        
    }
};

到了这里,关于【算法】动态规划练习(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 动态规划题目练习

    动态规划背包问题-CSDN博客 动态规划基础概念-CSDN博客 题目描述 棋盘上 A 点有一个过河卒,需要走到目标 B 点。卒行走的规则:可以向下、或者向右。同时在棋盘上 C 点有一个对方的马,该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河

    2024年04月25日
    浏览(25)
  • Open Judge——动态规划练习

    目录 了解动态规划 2760:数字三角形 1、题目 2、代码 4120:硬币 1、题目 2、代码 动态规划  是编程解题的一种重要手段。1951 年美国数学家 R.Bellman 等人,根据一类多阶段问题的特点,把多阶段决策问题变换为一系列互相联系的单阶段问题,然后逐个加以解决。与此同时,他提

    2024年02月06日
    浏览(44)
  • LeetCode练习八:动态规划下:背包问题

    参考: 【资料】算法通关手册、背包九讲 - 崔添翼 【文章】背包 DP - OI Wiki 【B站视频】代码随想录详解0-1背包    背包问题 :背包问题是线性 DP 问题中一类经典而又特殊的模型。背包问题可以描述为:给定一组物品,每种物品都有自己的重量、价格以及数量。再给定一个

    2024年01月16日
    浏览(50)
  • 【算法】动态规划 ⑧ ( 动态规划特点 )

    求解类型 : 动态规划 必须是求 最值 , 可行性 , 方案数 , 三者之一 , 如果求其它内容 , 则不能使用动态规划算法 ; 求最值 : 最大值 , 最小值 等 ; 大规模问题的结果 由 小规模问题 的计算结果 取最大值 大规模问题的结果 由 小规模问题 的计算结果 取最小值 可行性 : 是否可行

    2023年04月08日
    浏览(36)
  • 【算法 - 动态规划】原来写出动态规划如此简单!

    从本篇开始,我们就正式开始进入 动态规划 系列文章的学习。 本文先来练习两道通过 建立缓存表 优化解题过程的题目,对如何将 递归函数 修改成 动态规划 的流程有个基本的熟悉。 用最简单的想法完成题目要求的 递归 函数; 定义明确 递归函数 的功能!!! 分析是否存

    2024年02月21日
    浏览(35)
  • 60题学会动态规划系列:动态规划算法第三讲

    简单多状态问题 文章目录 一.按摩师 二.打家劫舍系列 三.删除并获得点数 四.粉刷房子 力扣链接:力扣 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,

    2024年02月08日
    浏览(37)
  • 【算法】动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )

    动态规划 , 英文名称 Dynamic Programming , 简称 DP , 不是具体的某种算法 , 是一种算法思想 ; 具体的算法都有具体的步骤 , 如 : 二分法 , 其 有固定的解决步骤 , 先取一个中心点 , 判断解在左边还是右边 , 然后在一边再取一个中心点 , 再进行判定 , 该算法有具体的步骤 ; 动态规划

    2024年01月16日
    浏览(37)
  • 60题学会动态规划系列:动态规划算法第一讲

    坚持就是胜利 - -  文章目录 1.第N个泰波那切数 2.三步问题 3.使用最小花费爬楼梯 4.解码方法 力扣链接:力扣 泰波那契序列 Tn 定义如下:  T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2 给你整数  n ,请返回第 n 个泰波那契数 Tn 的值。  首先我们分析一下

    2024年02月06日
    浏览(32)
  • 60题学会动态规划系列:动态规划算法第四讲

    买卖股票相关的动态规划题目 文章目录 1. 买卖股票的最佳时机含冷冻期 2. 买卖股票的最佳时期含⼿续费 3. 买卖股票的最佳时机III 4. 买卖股票的最佳时机IV 力扣链接:力扣 给定一个整数数组 prices ,其中第    prices[i]  表示第  i  天的股票价格 。​ 设计一个算法计算出最

    2024年02月13日
    浏览(25)
  • 60题学会动态规划系列:动态规划算法第五讲

    子数组系列题目 文章目录 1.最大子数组和 2.环形子数组的最大和 3.乘积最大数组 4.乘积为正数的最长子数组长度 5.等差数列划分 6.最长湍流子数组 7.单词拆分 8.环绕字符串中唯一的子字符串 力扣链接:力扣 给你一个整数数组  nums  ,请你找出一个具有最大和的连续子数组(

    2024年02月15日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包