代码随想录算法训练营day32|动态规划part01

server/2024/10/18 22:37:59/

动态规划中每一个状态一定是由上一个状态推导出来的,这一点就区分于贪心,贪心没有状态推导,而是从局部直接选最优的。

第一题:509. Fibonacci Number

class Solution {public int fib(int n) {if (n < 2) return n;int a = 0, b = 1, c = 0;for (int i = 1; i < n; i++) {c = a + b;a = b;b = c;}return c;}
}
//非压缩状态的版本
class Solution {public int fib(int n) {if (n <= 1) return n;             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];}
}

第二题:70. Climbing Stairs 

这题和第一题的斐波那契数是差不多的。

// 常规方式
public int climbStairs(int n) {int[] dp = new int[n + 1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];
}
// 用变量记录代替数组
class Solution {public int climbStairs(int n) {if(n <= 2) return n;int a = 1, b = 2, sum = 0;for(int i = 3; i <= n; i++){sum = a + b;  // f(i - 1) + f(i - 2)a = b;        // 记录f(i - 1),即下一轮的f(i - 2)b = sum;      // 记录f(i),即下一轮的f(i - 1)}return b;}
}

第三题: 746. Min Cost Climbing Stairs 

// 方式一:第一步不支付费用
class Solution {public int minCostClimbingStairs(int[] cost) {int len = cost.length;int[] dp = new int[len + 1];// 从下标为 0 或下标为 1 的台阶开始,因此支付费用为0dp[0] = 0;dp[1] = 0;// 计算到达每一层台阶的最小费用for (int i = 2; i <= len; i++) {dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[len];}
}
// 方式二:第一步支付费用
class Solution {public int minCostClimbingStairs(int[] cost) {int[] dp = new int[cost.length];dp[0] = cost[0];dp[1] = cost[1];for (int i = 2; i < cost.length; i++) {dp[i] = Math.min(dp[i - 1], dp[i - 2]) + cost[i];}//最后一步,如果是由倒数第二步爬,则最后一步的体力花费可以不用算return Math.min(dp[cost.length - 1], dp[cost.length - 2]);}
}
// 状态压缩,使用三个变量来代替数组
class Solution {public int minCostClimbingStairs(int[] cost) {// 以下三个变量分别表示前两个台阶的最少费用、前一个的、当前的。int beforeTwoCost = 0, beforeOneCost = 0, currentCost = 0;// 前两个台阶不需要费用就能上到,因此从下标2开始;因为最后一个台阶需要跨越,所以需要遍历到cost.lengthfor (int i = 2; i <= cost.length; i ++) {// 此处遍历的是cost[i - 1],不会越界currentCost = Math.min(beforeOneCost + cost[i - 1], beforeTwoCost + cost[i - 2]);beforeTwoCost = beforeOneCost;beforeOneCost = currentCost;}return currentCost;}
}

 


http://www.ppmy.cn/server/96547.html

相关文章

《网络安全自学教程》- Windows防火墙原理分析与策略配置

《网络安全自学教程》 防火墙(Firewall)是用来「隔离」内、外「网络」的安全设备,可以是硬件设备、软件或者云防火墙。 Windows防火墙 1、防火墙分类1.1、包过滤防火墙1.2、应用代理防火墙1.3、状态检测防火墙1.4、下一代防火墙2、开启防火墙3、添加策略1、防火墙分类 防火…

【SpringBoot】Web配置之 数据转换配置

// 2024.8.7 6:57 //Spring Boot支持对请求或者返回的数据类型进行转换&#xff0c;常用到的是统一对返回的日期数据自动格式化。 //配置如下&#xff1a; //定义时间格式转换器 Bean public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter(){ MappingJac…

sql常用语法总结

SQL(Structured Query Language,结构化查询语言)是一种用于管理和操作关系数据库的标准编程语言。本文用来记录一些接触到的sql语句,随着学习不断进行更新: 选择数据 - SELECT 语句用于从数据库表中检索数据。 SELECT column1, column2 FROM table_name;插入数据 - INSERT…

什么是流程图?全面介绍、基本元素及常用软件

流程图是将复杂过程从想法产生到项目执行的各个阶段可视化的重要工具。它可以将模糊的过程步骤具体化&#xff0c;将抽象过程转化为清晰可执行的计划。通过流程图&#xff0c;人们可以克服从构思到实施的巨大差距&#xff0c;使复杂的过程和步骤更具体、更清晰地被捕捉和传达&a…

UNI-APP_点击,长按,触摸,结束触摸事件

touchstartEventHandle手指触摸动作开始字节跳动小程序不支持touchmoveEventHandle手指触摸后移动字节跳动小程序不支持touchendEventHandle手指触摸动作结束字节跳动小程序不支持touchcancelEventHandle手指触摸动作被打断&#xff0c;如来电提醒&#xff0c;弹窗字节跳动小程…

MySQL:基本概念,DDL语句,数据库约束,索引视图

SQL语句是对所有关系数据库都通用的命令语句&#xff0c;而JDBC API只是执行SQL语句的工具&#xff0c;JDBC允许对不同的平台、不同的数据库采用相同的编程接口来执行SQL语句。除标准的SQL语句之外&#xff0c;所有的数据库都会在标准SQL语句基础上进行扩展&#xff0c;增加一些…

大数据环境安装Elasticsearch Kibana可视化

1、用yum安装&#xff0c;配置仓库和镜像。 2、用离线软件包&#xff0c;rpm安装。 服务器环境CentOS7.9 因为云安装&#xff0c;配置镜像版本一直没有成功&#xff0c;改为直接下载软件安装。 官方网址&#xff1a;https://www.elastic.co/cn/downloads/elasticsearch 因为要…

网络安全知识核心20要点

1、什么是SQL注入攻击 概述 攻击者在 HTTP 请求中注入恶意的 SQL 代码&#xff0c;服务器使用参数构建数据库 SQL 命令时&#xff0c;恶意SQL 被一起构造&#xff0c;并在数据库中执行。 注入方法 用户登录&#xff0c;输入用户名 lianggzone&#xff0c;密码‘ or ‘1’’…