【动态规划Ⅰ】斐波那契、爬楼梯、杨辉三角

动态规划—斐波那契系列

  • 什么是动态规划
  • 斐波那契数组相关题目
    • 509. 斐波那契数 Easy
    • 1137. 第 N 个泰波那契数 Easy
  • 杨辉三角
    • 118. 杨辉三角 Easy
  • 爬楼梯相关题目
    • 70. 爬楼梯 Easy
    • 746. 使用最小花费爬楼梯 Easy

什么是动态规划

动态规划是一种通过将原问题分解为相对简单的子问题来解决复杂问题的方法。基本思想是递归地将一个复杂的问题划分为许多更简单的子问题,存储这些子问题的每个子问题的解,并最终将存储的答案用于解决原始问题。通过缓存子问题的解,动态规划有时可以避免指数级的浪费。它通常用于优化问题,其中需要找到最佳解决方案。动态规划算法通常用于解决具有重叠子问题和最优子结构性质的问题。

  • 重叠子问题:原问题可以被分解为相同的子问题。这意味着在解决原问题时,我们可能多次解决相同的子问题。
  • 最优子结构:问题的最优解可以通过其子问题的最优解来求解。

通常,使用动态规划解决问题的步骤包括以下几个方面:

  • 定义子问题:将原问题分解为子问题。
  • 解决子问题:解决子问题并将结果存储起来,通常使用数组或类似的数据结构来存储子问题的解,以避免重复计算。
  • 合并子问题的解:利用子问题的解构建原问题的解。
  • 递归或迭代:通常使用递归或迭代的方式来解决问题。

斐波那契数组相关题目

斐波那契数组是典型的动态规划问题,可以从存储的子问题答案扩展到要求解的大问题。

509. 斐波那契数 Easy

509. 斐波那契数

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
给定 n ,请计算 F(n) 。

其实可以直接用一个数组,dp[i]就对应F(i),但实际上我们并不需要整个数组,只需要F(n),而F(n)只和F(n-1)和F(n-2)相关,因此直接用两个变量存储即可。更新过程就是F(n) = F(n - 1) + F(n - 2)。Java代码如下:

class Solution {public int fib(int n) {if(n <= 1)return n;int f0 =0, f1 = 1;for(int i = 2; i <= n; i++){int cur = f0 + f1;f0 = f1;f1 = cur;}return f1;}
}

1137. 第 N 个泰波那契数 Easy

1137. 第 N 个泰波那契数

泰波那契序列 Tn 定义如下:
T0 = 0, T1 = 1, T2 = 1, 且在 n >= 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2
给你整数 n,请返回第 n 个泰波那契数 Tn 的值。

这个和上面的斐波那契基本一样,只是当前状态由前面三个状态决定,而不是前面两个。用三个变量分别存储Tn、Tn+1、Tn+2,按照 Tn+3 = Tn + Tn+1 + Tn+2逐步更新即可。 Java代码如下:

    public int tribonacci(int n) {if(n <= 1)return n;if (n == 2)return 1;int f0 = 0, f1 = 1, f2 = 1;for(int i = 3; i <= n; i++){int cur = f0 + f1 + f2;f0 = f1;f1 = f2;f2 = cur;}return f2;}
}

杨辉三角

118. 杨辉三角 Easy

118. 杨辉三角

给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。
在「杨辉三角」中,每个数是它左上方和右上方的数的和。
在这里插入图片描述

其实斐波那契和杨辉三角,都是数学里面学过的,更新过程已经很清晰了。 上面的图这个三角形,如果变成数组左下角直角的形式,对于每一行,dp[i][j] = dp[i-1][j-1] + dp[i-1][j]。Java代码如下:

class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> triangle = new ArrayList<>();   for(int i = 0; i < numRows; i++){List<Integer> newRow = new ArrayList<>();            for(int j = 0; j <= i; j++){if(j==0 || j==i)newRow.add(1);elsenewRow.add(triangle.get(i-1).get(j) + triangle.get(i-1).get(j-1));}           triangle.add(newRow);}return triangle;        }
}

爬楼梯相关题目

70. 爬楼梯 Easy

70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

根据题目,到第n阶台阶,可以从n-1跨一步到;可以从n-2跨两步到。因此动态规划的状态转移:dp[n] = dp[n-1] + dp[n-2]。实际上只需要存储dp[n-1]和dp[n-2]这两个变量即可。Java代码如下:

class Solution {public int climbStairs(int n) {if(n <=2 )return n;int stair1 =1, stair2 = 2;for(int i = 3; i <= n; i++){int cur = stair1 + stair2;stair1 = stair2;stair2 = cur;}return stair2;    }
}

746. 使用最小花费爬楼梯 Easy

746. 使用最小花费爬楼梯

给你一个整数数组 cost ,其中 cost[i] 是从楼梯第 i 个台阶向上爬需要支付的费用。一旦你支付此费用,即可选择向上爬一个或者两个台阶。
你可以选择从下标为 0 或下标为 1 的台阶开始爬楼梯。
请你计算并返回达到楼梯顶部的最低花费。
示例 1:
输入:cost = [10,15,20]
输出:15
解释:你将从下标为 1 的台阶开始。支付 15 ,向上爬两个台阶,到达楼梯顶部。总花费为 15 。

上一个题目是直接求方法总和,这个题目是最小最大问题。 但本质上两个题一样的,因此到当前第i个台阶的代价,取决与i-1和i-2。因为在i-1个台阶上付出cost[i-1]的费用,选择向上一个台阶就到了第i阶;同样在第i-2个台阶上付出cost[i-2]的费用,选择向上两个台阶就到了第i个台阶。因为是最小值,因此dp[i] = min(dp[i-2] + cost[i-2], dp[i-1] + cost[i-1])。由于只和dp[i-1]、dp[i-2]两个状态相关,因此可以优化成只用两个变量存储,Java代码如下:

class Solution {public int minCostClimbingStairs(int[] cost) {int n = cost.length;if(n == 2)return Math.min(cost[0],cost[1]);int minCost1 = 0, minCost2 = 0;for(int i = 2; i <= n ; i++){int newCost = Math.min(minCost1 + cost[i-2], minCost2 + cost[i-1]);minCost1 = minCost2;minCost2 = newCost;}return minCost2;}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/45080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

近期几首小诗汇总-生活~卷

生活 为生活飘零&#xff0c;风雨都不阻 路见盲人艰&#xff0c;为她心点灯 贺中科大家长论坛成立十五周年 科学家园有喜贺 园外丑汉翘望中 曾一学子入我科 正育科二盼长大 憧憬也能入此家 与科学家论短长 园外翘首听高论 发现有隙入此坛 竟然也能注册成 入园浏览惶然立 此贴…

JAVA中的回溯算法解空间树,八皇后问题以及骑士游历问题超详解

1.回溯算法的概念 回溯算法顾名思义就是有回溯的算法 回溯算法实际上一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;就“回溯”返回&#xff0c;尝试别的路径。回溯法是一种选优搜索法&#xff…

[线性RNN系列] Mamba: S4史诗级升级

前言 iclr24终于可以在openreview上看预印本了 这篇&#xff08;可能是颠覆之作&#xff09;文风一眼c re组出品&#xff1b;效果实在太惊艳了&#xff0c;实验相当完善&#xff0c;忍不住写一篇解读分享分享。 TL;DR &#xff08;overview&#xff09; Structured State-Sp…

xshell公钥免密登录

设备&#xff1a;一台linux系统机器&#xff0c;一台windows系统机器 软件&#xff1a;xshell 要求&#xff1a;公钥免密登录 一、生成公钥、私钥 1、打开shell &#xff1b; 点击工具 &#xff1b; 新建用户生成密钥向导 2、生成密钥参数 密钥类型&#xff1a;RS…

element ui ts table重置排序

#日常# 今天带的实习生&#xff0c;在遇到开发过程中&#xff0c;遇到了element ui table 每次查询的时候都需要重置排序方式&#xff0c;而且多个排序是由前端排序。 <el-table :data"tableData" ref"restTable"> </<el-table> <script…

bi项目笔记

1.bi是什么 bi项目就是商业智能系统&#xff0c;也就是数据可视画、报表可视化系统&#xff0c;如下图的就是bi项目了 2.技术栈

Linux rsync文件同步工具

scp的不足 1. 性能问题 单线程传输 SCP只使用单线程进行传输&#xff0c;这意味着在传输大文件或大量小文件时&#xff0c;其传输速度和效率可能不如其他多线程工具。 无法压缩数据传输 SCP不支持内置的压缩机制&#xff0c;这在传输大文件时会导致带宽使用效率较低。 2.…

我花了5年时间训练自己这种能力,希望你也能成功

人生最重要的能力是日拱一卒&#xff0c;即每天做一点点对自己有利的事并持续足够长的时间。作者之前急于求成&#xff0c;减肥失败。同事通过每月改进一件小事成功减肥且知识储备丰富。作者受启发后&#xff0c;通过走楼梯、换代糖等小改变&#xff0c;用 4 年减了 40 斤&…

从头开始搭建一套Elasticsearch集群

前言 刚开始使用ES接触的就是rpm或者是云上提供的ES服务&#xff0c;基本上开箱即用。特别是云上的ES服务&#xff0c;开局就是集群版本&#xff0c;提供的是优化后的参数配置、开箱即匹配访问鉴权及常用插件&#xff0c;如无特殊需要基本上屏蔽了所有细节&#xff0c;直接可投…

深入了解 MySQL 的 EXPLAIN 命令

一、什么是 EXPLAIN 命令&#xff1f; EXPLAIN 命令用于显示 MySQL 如何执行某个 SQL 语句&#xff0c;尤其是 SELECT 语句。通过 EXPLAIN 命令&#xff0c;可以看到查询在实际执行前的执行计划&#xff0c;这对于优化查询性能至关重要。 二、EXPLAIN 的基本用法 要使用 EXP…

如何禁用键盘上的特定键或快捷方式?这里有详细步骤

要禁用特定的键盘键或快捷键吗&#xff1f;微软官方应用程序Microsoft PowerToys使这项任务变得非常简单。以下是使用Microsoft PowerToys中的键盘管理器禁用特定键或快捷方式的快速指南。 如果你还没有安装Microsoft PowerToys 如果你的设备上没有安装Microsoft PowerToys&a…

springboot上传图片

前端的name的值必须要和后端的MultipartFile 形参名一致 存储本地

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【匿名密钥证明(C/C++)】

匿名密钥证明(C/C) 在使用本功能时&#xff0c;需确保网络通畅。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 确定密钥别名keyAlias&#xff0c;密钥别名最大长度为64字节&#xff1b;初始化参数集&#xff1a;通过[OH_Huk…

css3 transform的旋转和位移制作太阳花

css3 transform 实例展示知识点rotate 旋转translate 位移transform: translate(300px,200px) rotate(90deg) 实例代码 实例展示 知识点 transform的两个属性 rotate 旋转 translate 位移 transform: translate(300px,200px) rotate(90deg) 实例代码 <!DOCTYPE html&g…

flask 定时任务(APScheduler)使用current_app app_context()上下文

前言: 描述&#xff1a;flask定时任务调用的方法中使用了current_app.logger.info()记录日志报错 报错代码 raise RuntimeError(unbound_message) from None RuntimeError: Working outside of application context.This typically means that you attempted to use functiona…

IDEA中Git常用操作及Git存储原理

Git简介与使用 Intro Git is a free and open source distributed version control system designed to handle everything from small to very large projects with speed and efficiency. Git是一款分布式版本控制系统&#xff08;VSC&#xff09;&#xff0c;是团队合作开发…

算法学习笔记(8.3)-(0-1背包问题)

目录 最常见的0-1背包问题&#xff1a; 第一步&#xff1a;思考每轮的决策&#xff0c;定义状态&#xff0c;从而得到dp表 第二步&#xff1a;找出最优子结构&#xff0c;进而推导出状态转移方程 第三步&#xff1a;确定边界条件和状态转移顺序 方法一&#xff1a;暴力搜素…

MFC之对话框--线宽/线型/颜色

文章目录 线宽输入实现优化无法记录上一次线粗问题 线宽滑动实现实现选择线类型实现颜色选择总结 线宽输入实现 优化无法记录上一次线粗问题 线宽滑动实现 实现选择线类型 实现颜色选择 总结 1。创建新窗口&#xff08;dialog)会创建一个新的类&#xff0c;在类中实现窗口中的…

vue中父子传递属性值

1、父传子属性值 自定义图库组件 在add.vue中应用tuku组件并给默认值 效果 2、 子传父&#xff0c;逆向赋值 add.vue和第一问中一样 修改tuku组件&#xff0c;传值给add.vue 3、多个传递 效果&#xff1a; 点击两个修改按钮后 4、使用defineModel简化父子传值 其他代码跟…

【postgresql】时间函数和操作符

日期/时间操作符 加减操作符&#xff1a; 和 - 可以用于日期、时间、时间戳和时间间隔的加减操作。 SELECT 2024-01-01::date INTERVAL 1 day as "date"; ; -- 结果&#xff1a;2024-01-02SELECT 2024-01-01 12:00:00::timestamp - INTERVAL 2 hours as "…