算法训练营Day34

#Java #动态规划

开源学习资料

Feeling and experiences:

动态规划的关键几个步骤:

1. 定义子问题:将原问题分解成较小的子问题。


2. 实现递归关系:建立子问题之间的递归关系,这些关系通常以数学形式表达,称为递推公式。


3. 存储子问题的解:动态规划通过存储这些子问题的解(通常在一个数组或其他数据结构中)来避免重复计算。


4. 构造最终解:从存储的子问题解中构造原问题的解。

斐波那契数:力扣题目链接

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 01 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n)

这道题遇到过很多次了,也非常简单:

这是递归的写法(显然一般都是不会用这个方法的)

class Solution {public int fib(int n) {if(n==0){return 0;}if(n==1){return 1;}return fib(n-1) + fib(n-2);}
}

这还没有体现到动态规划的dp方程

用动态规划的思想来做:

题目直接就把动态转移方程给了我们:状态转移方程 dp[i] = dp[i - 1] + dp[i - 2];

 

class Solution {public int fib(int n) {if (n <= 1) return n;     //创建dp数组        int[] dp = new int[n + 1];//初始化dp[0] = 0;dp[1] = 1;//递推公式for (int index = 2; index <= n; index++){dp[index] = dp[index - 1] + dp[index - 2];}return dp[n];}
}

递归五部曲:

确定dp数组及下标的含义:第 i 个数的值为dp[i];

确定递推公式:题目已知:dp[i] = dp[i - 1] + dp[i - 2];

初始化:dp[0]=0,dp[1]=1;

确定顺序:从前往后,依次递推

举例推到验证;

爬楼梯:力扣题目链接

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 12 个台阶。你有多少种不同的方法可以爬到楼顶呢?

1.创建一个dp数组,dp数组代表的含义:到第i级楼梯,有dp[i]种方法;

2.递推公式:dp[i] = dp[i-1]+dp[i-2];

3.初始化dp数组:(我用的是从dp[1]开始,dp[1]=1,dp[2]=2)

4.顺序为从前往后,依次递推

5.验证:i=3时,dp[3]=dp[2]+dp[1] = 1+2 =3; .......

class Solution {public int climbStairs(int n) {if(n<=1){return n;}//创建dp数组,代表的意义(到第i级楼梯,有dp[i]种方法)int []dp  = new int[n+1];//递推公式//dp[i] = dp[i-1]+dp[i-2];//初始化dp数组dp[1] = 1;dp[2] = 2;for(int i=3;i<=n;i++){dp[i] = dp[i-1]+dp[i-2];}return dp[n];}
}

下面这种是用了滚动数组的思想(其本质也是递推),这是代码写法不一样

class Solution {public int climbStairs(int n) {int p=0,q=0,r=1;for(int i =1;i<=n;++i){p = q;q = r;r =q+p;}return r;}
}

使用最小花费爬楼梯:力扣题目链接

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

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

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

1. 首先,确定了楼梯的总数,即变量 n 代表楼梯数量,通过 cost.length 获取。


2. 创建一个名为 dp 的数组,用于存储到达每个台阶所需的最小花费。数组长度为 n+1,以包括起始台阶和顶部台阶。


3. 初始化 dp 数组的前两个元素为 0,因为从第 0 级和第 1 级楼梯开始不需要支付额外费用。


4. 使用循环遍历从第 2 级楼梯到第 n 级楼梯的每个台阶。对于每个台阶 i,计算到达该台阶的最小花费,这是从前一级台阶 i-1 或前两级台阶 i-2 中选择最小花费的方式。


5. 最终,返回 dp[n],即到达顶部楼梯的最小花费。
 

class Solution {public int minCostClimbingStairs(int[] cost) {int n = cost.length;//创建dp数组int []dp = new int[n+1];//递推公式://爬到第i级楼梯需要支付的费用:要么是爬到i-1支付的费用加上当前还需要支付的费用//或者是爬到i-2支付的费用加上当前需要支付的费用//取最小的那个//dp[i] = Math,min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);//初始化dp数组dp[0] = 0;dp[1] = 0;   //0,1级台阶可以直接上去,所以初始化为0//递推:for(int i=2;i<=n;i++){dp[i] = Math.min(dp[i-1]+cost[i-1],dp[i-2]+cost[i-2]);}return dp[n];}
}

主要就是递推公式和dp数组的初始化,结合贪心的思想,也比较容易写出来。

大丈夫生居天地间,

岂能郁郁久居人下?

Fighting1


 

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

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

相关文章

泛型擦除到底是怎么一回事

一.泛型擦除 泛型擦除是什么&#xff1f; 众所周知&#xff0c;Java的泛型只在编译时有效&#xff0c;到了运行时这个泛型类型就会被擦除掉&#xff0c;即List<String>和List<Integer>在运行时其实都是List<Object>类型。 为什么选择这种实现机制&#xf…

windows 10 安装wsl ubuntu

1.首先管理员模式打卡powershell&#xff0c;执行 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart 2.执行 wsl --update wsl --…

python 基础语法函数

函数定义 def 函数名(形参列表用逗号隔开)&#xff1a; 函数体 return 返回值 # 有参数 无返回值 def my_length(data):count 0for i in data:count 1print(f"data count{count}")my_length(str1) my_length(str2)#无参数无返回值 def say_hello():print("h…

全网唯一值得推荐的C/C++框架和库

全网唯一值得推荐的C/C框架和库 C程序员开发指南 ​ 关注我&#xff0c;天天分享C/C开发技术干货&#xff01; ​关注他 30 人赞同了该文章 ​ 目录 收起 标准库 C通用框架和库 人工智能 异步事件循环 音频 生态学 压缩 并发性 容器 数据库 调试 游戏引擎 图…

Vue中的双向数据绑定是如何实现的

解析 双向数据绑定是Vue框架的核心特性之一&#xff0c;它允许开发者在Vue组件中实现数据的自动同步。当数据发生变化时&#xff0c;视图会自动更新&#xff1b;反过来&#xff0c;当用户在视图中修改数据时&#xff0c;数据也会自动更新。 Vue中的双向数据绑定是通过使用v-m…

死机重启不开机

1. 修改rc文件,使得开机即打开AEE: /vendor/mediatek/proprietary/external/aee/config_external/init.aee.customer.vendor.rc里添加 on init setprop ro.vendor.aee.enforcing no(注意修改此属性后, 无法通过CTS 安全测试项, 在正式发布版本时, 需要恢复默认设置,把此行修…

代码随想录训练营第五十七天| ● 647. 回文子串 ● 516.最长回文子序列● 动态规划总结篇

647. 回文子串 动态规划解决的经典题目&#xff0c;如果没接触过的话&#xff0c;别硬想 直接看题解。 代码随想录 dp数组定义&#xff1a;布尔类型的dp[i][j]&#xff1a;表示区间范围[i,j] &#xff08;注意是左闭右闭&#xff09;的子串是否是回文子串&#xff0c;如果是…

西门子消防主机控制面板显示盘维修B3Q565

作为图形监控主机&#xff0c;负责接收并储存各消防设备主要运行状态&#xff0c;接收火灾报警并显示报警部位&#xff0c;包括火灾报警、状态监视、设备故障报警、网络故障报警﹐指挥抢险救援的活动,进行火灾信息的处理与传送&#xff0c;同时具备提示操作人员的功能&#xff…

TS:类型断言

类型断言好比其他语言中的类型转换&#xff0c;但是不是真正的类型转换方式&#xff0c;之所以不被称为类型转换&#xff0c;是因为转换通常意味着某种运行时的支持。但是&#xff0c;类型断言纯粹是一个编译时语法&#xff0c;同时&#xff0c;它也是一种为编译器提供关于如何…

使用代理IP实现爬虫的匿名性

目录 前言 一、什么是代理IP&#xff1f; 二、使用Python实现代理IP爬虫 1. 安装所需模块 2. 获取代理IP列表 3. 使用代理IP进行爬取 4. 使用代理IP进行数据抓取 三、总结 前言 随着互联网的快速发展&#xff0c;网络爬虫已经成为了获取互联网数据的一种重要方式。然而…

原生JS实现抽奖

1、效果展示 0. 制作一个MiniSize使用提供的素材实现一个转盘活动的布局&#xff08;如下图所示&#xff09;&#xff1b; 进入界面后2秒钟后开始旋转&#xff0c;5秒钟后停止旋转&#xff1b;并且3秒后进入一个表单界面&#xff08;如下图2所示&#xff09;&#xff1b;界面…

vins 实机测试 rs_d435 + imu

vins 实机测试 文章目录 1. imu标定2. camera内参标定3. imu-cam 外参标定4. vins 实际运行5. realsense 1. imu标定 git clone https://github.com/gaowenliang/code_utils.git git clone https://github.com/gaowenliang/imu_utils.git编译运行&#xff0c; roslaunch imu_…

Unity 圆角 线段 绘制 LineRender

需求 绘制圆角 核心函数 /// <summary>/// 点ABC 形成的角度必须为90 点c为中间的点/// </summary>/// <param name"a"></param>/// <param name"b"></param>/// <param name"c"></param>/// &…

CH08_管理状态

Observer 模式 观察者模式&#xff08;Observer&#xff09;&#xff0c;又叫发布订阅模式&#xff08;Publish/Sunscribe&#xff09;模式&#xff0c;定义了一种一对多的依赖关系&#xff0c;让多个观察者对象同时监听某一个主题对象。这个主题对象在状态发生变化时&#xf…

2个nodejs进程利用redis 实现订阅发布

1.新建文件 redis_db.js use strict;const redis require(redis); const options {host: "127.0.0.1",port: 6379,password: "123456", // CONFIG SET requirepass "123456" }var array [] for(var i0; i<3; i){const client redis.crea…

git 使用场景 cherry-pick 其他代码仓库代码

Cherry-pick 其他代码库代码 1. git remote add target gitgithub.xxxxxx/testGit.git 1. 添加了一个远程仓库target 2. git fetch target 2. 远程代码抓取到本地 3. git log target/master 3. …

MySQL数据库的CURD、常见函数及UNION和UNION ALL

一、概述 MySQL是一种流行的关系型数据库管理系统&#xff0c;广泛应用于各种应用场景。在MySQL中&#xff0c;CURD操作是指创建&#xff08;Create&#xff09;、读取&#xff08;Read&#xff09;、更新&#xff08;Update&#xff09;和删除&#xff08;Delete&#xff09;…

安装extiverse/mercury时报错

问题描述 作者在安装 Flarum 的插件 extiverse/mercury 时报错&#xff0c;内容如下图所示 解决方案 ⚠警告&#xff1a;请备份所有数据再进行接下来的操作&#xff0c;此操作可能会导致网站不可用&#xff01; 报错原因&#xff1a;主要问题是在安装过程中解决依赖关系。具…

CentOS 9 (stream) 安装 Docker

1. Docker 简介 Docker 是一个开源的容器化平台&#xff0c;可帮助开发者轻松地创建、部署和运行应用程序。Docker 使开发人员能够在一个独立的容器中打包应用程序及其依赖项&#xff0c;这样他们就可以轻松地将应用程序移植到任何其他环境中。 Docker 主要由以下几个组件组成…

使用CentOS 7.6搭建HTTP隧道代理服务器

在现代网络环境中&#xff0c;HTTP隧道代理服务器因其灵活性和安全性而受到广泛关注。CentOS 7.6&#xff0c;作为一个稳定且功能强大的Linux发行版&#xff0c;为搭建此类服务器提供了坚实的基础。 首先&#xff0c;我们需要明确HTTP隧道代理的基本原理。HTTP隧道代理允许客户…