LeetCode动态规划的解题思路

动态规划

动态规划,其实就是找规律,总结公式/方程。
动态规划,类似于数学归纳法。
关键的思想在「自底向上」和「空间换时间」。
动态规划,可以使用一维数组,有时也会用到二维数组。

应用场景

“动态规划”可以用于子序列、最大/小值问题、回文子串的求解。

一维数组dp[i] 的动态规划的几个步骤:
  • 确定数组dp[i]的下标i以及dp[i]值的含义,比如经典的LeetCode70爬楼梯, 爬到第i层楼梯,有dp[i]种方法;
  • 确定动态规划的状态转移方程(递推公式)。比如,爬楼梯的公式:dp[i] = dp[i-1] + dp[i-2];
  • dp数组的初始化:初始化值,dp[0]的值是多少 , dp[1]的值又是多少;
  • 确定遍历顺序:分析递推顺序应该是从前往后,还是从后往前。还有就是,要从哪一个下标开始遍历;
LeetCode70. 爬楼梯

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

public int climbStairs(int n) {if (n <= 0) {return 0;}//dp数组的初始化//爬到第i层楼梯,有dp[i]种方法;int[] dp = new int[n + 2];//dp数组的初始化dp[0] = 0;dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {//确定动态规划的状态转移方程(递推公式)dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];
}

LeetCode53. 最大子数组和

  • 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
    子数组 是数组中的一个连续部分。

示例 1:
输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

class Solution {public int maxSubArray(int[] nums) {int length=nums.length;int[] dp=new int[length];//初始值dp[0]=nums[0];int maxSum=nums[0];for(int i=1;i<length;i++) {//dp[i]表示以第 i 个数结尾的「连续子数组的最大和」//由于子数组是以nums[i]结尾,//如果dp[i-1]是正数,那么dp[i]最大值是dp[i-1]+nums[i]//如果dp[i-1]是负数,那么dp[i]最大值是nums[i]//状态转移方程如下:dp[i]=Math.max(dp[i-1]+nums[i],nums[i]);//找出不同的数组元素结尾的最大值。maxSum=Math.max(dp[i],maxSum);}return maxSum;}
}
用二维数组的动态规划:

二维数组的动态规划,跟一维数组的动态规划,基本是一样的。

  • 设定状态。
    二维 dp 问题,可以使用二维数组 dp[i][j],第一维的下标i可以表示A事物的状态,第二维的下标j可以表示B事物的状态。
    比如LeetCode122的买卖股票,题中有两个状态,一个是天数,一个是是否持有股票,
    定义dp[i][0]表示第 i天交易完后手里没有股票的最大利润,
    dp[i][1] 表示第 i天交易完后手里持有一支股票的最大利润。
  • 思考状态转移方程(也就是公式)。
    找规律,找出 dp[i][j]是怎么由dp[i-1][j]、 dp[i-1][j-1] 推导得到的
  • 考虑初始值。
    也就是 dp[0][0] 、 dp[0][1] 之类的初始值。
  • 考虑输出。
    求出 dp[len - 1][j] (也可能是其他的如dp[len - 1][j]) 的值。

二维数组动态规划:122. 买卖股票的最佳时机 II

给你一个整数数组 prices ,其中 prices[i] 表示某支股票第 i 天的价格。

在每一天,你可以决定是否购买和/或出售股票。你在任何时候 最多 只能持有 一股 股票。你也可以先购买,然后在 同一天 出售。

返回 你能获得的 最大 利润 。

链接: https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/

解答:定义状态 dp[i][0] 表示第 i 天交易完后手里没有股票的最大利润,dp[i][1] 表示第 i 天交易完后手里持有一支股票的最大利润(i 从 0 开始)。

考虑 dp[i][0] 的转移方程,如果这一天交易完后手里没有股票,那么可能的转移状态为前一天已经没有股票,即 dp[i−1][0],或者前一天结束的时候手里持有一支股票,即 dp[i−1][1],这时候我们要将其卖出,并获得 prices[i]的收益。
dp[i][0]=max{dp[i−1][0],dp[i−1][1]+prices[i]}

对于dp[i][1],按照同样的方式考虑转移状态,那么可能的转移状态为前一天已经持有一支股票,即 dp[i−1][1],或者前一天结束时还没有股票,即 dp[i−1][0],这时候我们要将其买入,并减少 prices[i] 的收益。可以列出如下的转移方程:
dp[i][1]=max⁡{dp[i−1][1],dp[i−1][0]−prices[i]}

    public int maxProfit(int[] prices) {if (prices==null) {return 0;}int length = prices.length;//定义状态 dp[i][0]  表示第 i 天交易完后手里没有股票的最大利润,//dp[i][1] 表示第 i 天交易完后手里持有一支股票的最大利润(i 从 0 开始)。int[][] dp = new int[length][2];dp[0][0]=0;dp[0][1]=-prices[0];for (int i=1;i<length;i++) {dp[i][0] =  Math.max (dp[i-1][0], dp[i-1][1]+prices[i]);dp[i][1] =  Math.max (dp[i-1][1], dp[i-1][0]-prices[i]);}return dp[length-1][0];}

常见题目

动态规划常见题:LeetCode70,LeetCode121,LeetCode122,LeetCode5

参考资料:

《labuladong的算法小抄》
https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/solution/bao-li-mei-ju-dong-tai-gui-hua-chai-fen-si-xiang-b/

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

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

相关文章

idea2023创建spring项目无法选择Java8

idea2023创建spring项目无法选择Java8 今天下载了新版的idea 2023.3.2&#xff0c;但是在创建springboot项目的时候只能选择Java17和Java21&#xff0c;没法选择其他的版本。 使用下面阿里云的地址替换Server URL中的start.spring.io的地址即可 https://start.aliyun.com/替…

C#调用WechatOCR.exe实现本地OCR文字识别

最近遇到一个需求&#xff1a;有大量的扫描件需要还原为可编辑的文本&#xff0c;很显然需要用到图片OCR识别为文字技术。本来以为这个技术很普遍的&#xff0c;结果用了几个开源库&#xff0c;效果不理想。后来&#xff0c;用了取巧的方法&#xff0c;直接使用了WX的OCR识别模…

Linux大集合

Linux Linux是什么&#xff1f; Linux是一套免费使用和自由传播的类Unix操作系统&#xff0c;是一个基于POSIX和UNIX的多用户、多任务、 支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。它支持32位和 64位硬件。 Linux内核 是一个Linux系统…

可达鸭二月月赛——入门赛第四场T3题解

姓名 王胤皓 AC 记录 题目&#xff1a; 思路 用数组进行操作太难&#xff0c;而这些操作可以再 STL 中的 vector 容器&#xff0c;有 insert 和 erase 函数&#xff0c;所以非常方便。 vector 下标从 0 0 0 开始&#xff0c;所以所有操作都要 − 1 -1 −1。 操作 1 1 1 …

Redis的数据类型Hash使用场景实战

Redis的数据类型Hash使用场景 常见面试题&#xff1a;redis在你们项目中是怎么用的&#xff0c;除了String数据类型还使用什么数据类型&#xff1f; 怎么保证缓存和数据一致性等问题… Hash模型使用场景 知识回顾&#xff1a; redisTemplate.opsForHash() 方法是 Redis 的 …

Spring Boot3整合Redis

⛰️个人主页: 蒾酒 &#x1f525;系列专栏&#xff1a;《spring boot实战》 &#x1f30a;山高路远&#xff0c;行路漫漫&#xff0c;终有归途。 目录 前置条件 1.导依赖 2.配置连接信息以及连接池参数 3.配置序列化方式 4.编写测试 前置条件 已经初始化好一个spr…

MyBatisPlus基础操作之增删改查

目录 一、基本使用 1.1 插入数据 1.2 删除操作 1.3 更新操作 二、条件构造器Wrapper 2.1 常用AbstractWrapper方法 2.1.1 示例一 2.2.2 示例二 2.2.3 示例三 2.2 常用QueryWrapper方法 2.2.1 示例一 2.2.2 示例二 2.2.3 示例三&#xff08;常用&#xff09; 2.3 常…

【春节特辑】回顾与展望:运维软件领域的2023与2024

随着信息技术的飞速发展&#xff0c;运维软件领域在过去的一年里取得了显著进步&#xff0c;不仅提升了系统的稳定性与安全性&#xff0c;还为企业带来了更高的效率和更低的成本。同时&#xff0c;面对快速变化的市场环境和用户需求&#xff0c;运维软件也在不断创新与进化&…

linux系统非关系型数据库memcached

memcached 特点原理配置安装Memcached 特点 内置内存存储方式-----------为了提高性能&#xff0c;memcached中保存的数据都存储在memcache内置的内存存储空间中。由于数据仅存在于内存中&#xff0c;重启操作系统会导致全部数据消失简单key/value存储---------------服务器不…

1978-2022年地级市全要素生产率数据

1978-2022年地级市全要素生产率数据 1、时间&#xff1a;1978-2022年 2、来源&#xff1a;城市统计年鉴以及各省市的统计年鉴 3、指标&#xff1a;省份、地区、年份、OLS、FE、RE、DGMM、SGMM、SFA1、SFA2、SFA3、SFA3D、TFE、非参数法 4、范围&#xff1a;421地区 5、参考…

Deepin基本环境查看(八)【系统安全:房、车、查房、查车】

Deepin基本环境查看&#xff08;八&#xff09;【系统安全&#xff1a;房、车、查房、查车】 - 相关文章目录1、概述2、想象中的... 现实中的...1&#xff09;想象中的我2&#xff09;梦幻中的我3&#xff09;现实中的我 3 要房、要车、还是房车都要1&#xff09;超级计算机2&a…

Pymysql之Connection中常用API

Connection中常用API 1、open() &#xff1a;检测数据库是否连接。 connect.open&#xff1a;如果数据库连接返回Trhe&#xff0c;否则返回False。 2、ping(reconnectTrue) connect.ping(reconnectTrue):如果reconnectTrue表示连接断开后&#xff0c;重新进行连接。 import…

Docker-Learn(三)创建镜像Docker(换源)

根据之前的内容基础&#xff0c;本小点的内容主要涉及到的内容是比较重要的文本Dockerfile 1. 编辑Dockerfile 启动命令行终端&#xff08;在自己的工作空间当中&#xff09;,创建和编辑Dockerfile。 vim Dockerfile然后写入以下内容 # 使用一个基础镜像 FROM ubuntu:late…

前端代码评审规范

前端代码评审规范 代码千万行&#xff0c;安全第一行&#xff1b;代码不规范&#xff0c;维护两行泪。阅读规范前&#xff0c;请先阅读项目自带的README.md&#xff0c;配置好项目代码统一的格式检查。 一、代码规范 1. 文件规范 1.1 文件目录模块划分 1.1.1 文件创建原则…

Vscode SSH使用云服务器访问内网主机

Vscode SSH使用云服务器访问内网主机 云服务器在配置策略中开放使用到的端口号&#xff0c;比如250和251作为使用。 首先在内网主机上使用ssh-copy-id root云服务器公网IP&#xff0c;将内网主机的公钥放到服务器上 这一步必须完成&#xff0c;不然下面的命令无法成功建立隧…

Centos8保姆级安装教程

1.下载地址 Downloadhttps://www.centos.org/download/ 2.安装教程 第一步创建新的虚拟机 第二步自定义高级 第三步这里是选择系统的兼容性&#xff0c;默认就可以 之后直接下一步 第四步选择稍后安装操作系统 之后点击下一步 第五步选择操作系统Linux 安装的是centos8 64位…

MySQL的MVCC机制

MVCC机制 使用MVCC(Multi-Version Concurrency Control&#xff0c;多版本的并发控制协议)机制来实现可重复读(REPEATABLE READ)的隔离级别 MVCC最大的优点是读不加锁&#xff0c;因此读写不冲突&#xff0c;并发性能好。InnoDB实现MVCC&#xff0c;是通过保存数据在某个时间点…

2023蓝桥杯python大学A组部分题目详细解析

目录 特殊日期 分糖果 三国游戏 平均 特殊日期 记一个日期为yy年mm月dd 日&#xff0c;统计从2000年1月1日(含&#xff09;到2000000年1月1日(含)&#xff0c;有多少个日期满足年份yy是月份mm的倍数&#xff0c;同时也是dd的倍数。 题目链接 https://www.lanqiao.cn/prob…

Ps:信息面板选项

点击“信息”面板控制菜单按钮&#xff0c;打开“信息面板选项” Info Panel Options对话框。 第一颜色信息 First Color Readout 指定在“信息”面板中的“第一颜色信息”区域显示的像素颜色值所基于的颜色模式。 模式 Mode --实际颜色 Actual Color 默认选项。显示在当前颜色…

第二十九天| 491.递增子序列 、46.全排列、47.全排列 II

Leetcode 491.递增子序列 题目链接&#xff1a;491 递增子序列 题干&#xff1a;给你一个整数数组 nums &#xff0c;找出并返回所有该数组中不同的递增子序列&#xff0c;递增子序列中 至少有两个元素 。你可以按 任意顺序 返回答案。 数组中可能含有重复元素&#xff0c;如出…