当前位置: 首页 > news >正文

动态规划问题

一、动态规划

1、核心思想

将问题划分为若干个子问题,并在计算子问题的基础上,逐步构建出原问题的解

2、解题步骤

  1. 定义状态:将原问题划分为若干个子问题,定义状态表示子问题的解,通常使用一个数组或者矩阵来表示
  2. 确定状态转移方程:在计算子问题的基础上,逐步构建出原问题的解;这个过程通常使用“状态转移方程”来描述,表示从一个状态转移到另一个状态的转移规则
  3. 初始化状态
  4. 计算原问题的解(最终答案)
  5. 通过计算状态之间的转移,最终计算出原问题的解
  6. 通常使用递归或者迭代(循环)的方式计算

二、斐波那契数列

1、核心思想

从第二个数开始,每一个斐波那契数都是它前面两个斐波那契数之和

2、代码实现

1、递归的方法
function fib(n: number): number {// 0 1 1 2 3 5 8 13 21 34 55if(n <= 1) return nreturn fib(n - 1) + fib(n - 2)
}
console.log(fib(10))   // 55
2、记忆化搜索
function fib(n: number, memo: number[] = []): number {if(n <= 1) return n// 求n 的值,直接从memo 中取if(memo[n]) {return memo[n]}// 如果memo 中没有这个位置的值时,再去计算const res = fib(n - 1, memo) + fib(n - 1, memo)memo[n] = resreturn res
}
3、动态规划
function fib(n: number): number {// 1.定义状态// dp 保留斐波那契数列中每一个位置对应的值(状态)// dp[x]表示的就是x 位置对应的值// 2.状态转移方程:dp[i] = dp[i-1] + dp[i-2]// 状态转移方程一般情况都是写在循环中// 3.设置初始化状态:dp[0]/dp[1]初始化状态// 4.计算最终的结果// 1.定义状态// 2.初始化状态const dp: number[] = []dp[0] = 0dp[1] = 1// 3.状态转移方程for(let i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2]}    //4.最终结果return dp[n]
}
4、状态压缩
function fib(n: number): number {if(n <= 1) return n// 1.定义状态// 2.初始化状态let prev = 0let cur = 1// 3.状态转移方程for(let i = 2; i <= n; i++) {const newValue = prev + curprev = cur cur = newValue}    //4.最终结果return cur
}

三、跳台阶(爬楼梯)

1、问题描述

一共有n 阶台阶,每次可以跳1 或 2阶台阶,问有多少种不同的跳法

2、核心思想

到达第n 阶台阶中能由第n - 1阶或第n - 2阶台阶跳上来

3、代码实现

1、动态规划
function jump(n: number): number {const dp: number[] = []  dp[0] = 1dp[1] = 1for(let i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2]}return dp[n]
}    
2、状态压缩
function jump(n: number): number {let prev = 1let cur = 1for(let i = 2; i <= n; i++) {const newValue = prev + curprev = curcur = newVal}return cur
} 

四、买卖股票的最佳时机

1、问题描述

给定一组股票数据,选择在某一天买入这只股票,并选择在未来的某一个不同的日子卖出这只股票,计算能获取的最大利润

2、代码实现

1、动态规划
// maxProfit([7,1,5,3,6,0,4])  ->  5
function maxProfit(prices: number[]): number {const n = prices.lengthif(n <= 1) return 0const dp: number[] = []dp[0] = 0for(let i = 1; i < n; i++) {dp[i] = Math.max(prices[i] - minPrice, dp[i - 1])minPrice = Math.min(prices[i], minPrice)}return dp[n-1]
}
2、状态压缩
function maxProfit(prices: number[]): number {const n = prices.lengthif(n <= 1) return 0let preValue = 0let minPrice = prices[0]for(let i = 1; i < n; i++) {preValue = Math.max(prices[i] - minPrice, preValue)minPrice = Math.min(prices[i], minPrice)}return preValue
}    

五、最大子数组和

1、问题描述

在一个整数数组nums,找出一个具有最大和的连续子数组,(子数组最少包含一个元素),返回其最大和

例如:

输入:nums = [-2, 1, -3, 4, -1, 2, 1, -5, 4]

输出:6

解释:[4, -1, 2, 1]

2、代码实现

1、动态规划
function maxArray(nums: number[]): number {const n = nums.lengthconst dp: number[] = []dp[0] = nums[0]for(let i = 1; i < n; i++) {dp[i] = Math.max(nums[i], nums[i] + dp[i - 1])}return Math.max(...dp)
}
2、状态压缩
function maxArray(nums: number[]): number {const n = nums.lengthlet preValue = dp[0]let max = preValuefor(let i = 1; i < n; i++) {preValue = Math.max(nums[i], nums[i] + preValue)max = Math.max(preValue, max)}return max
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 当前IT行业10大热门细分技术方向,哪一个更适合你?
  • 基于llama.cpp实现Llama3模型的guff格式转换、4bit量化以及GPU推理加速(海光DCU)
  • Nginx 配置文件中 location、proxy_pass最后的斜杠/作用
  • 仿RabbitMQ实现消息队列
  • 按图搜索的精准营销:基于拍立淘API返回值的用户画像
  • MySQL的基本语法记录
  • P1919 【模板】高精度乘法 | A*B Problem 升级版、P3803 【模板】多项式乘法(FFT)、P1595 信封问题(圆排列、错位排列)
  • 转行大模型成功进字节了!48k*15薪!
  • knowLedge-VueCLI项目中环境变量的定义与使用
  • 用C#实现连续打印pdf文件
  • 一起学习LeetCode热题100道(40/100)
  • LlamaIndex-milvus-RAG
  • 基于vue框架的yit商城uwd1i(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。
  • 【产品经理】竞品分析怎么理解?拆解一下
  • 万字干货!手把手教你如何训练超大规模集群下的大语言模型
  • 10个最佳ES6特性 ES7与ES8的特性
  • co模块的前端实现
  • java概述
  • JS基础篇--通过JS生成由字母与数字组合的随机字符串
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • node入门
  • Python 反序列化安全问题(二)
  • python_bomb----数据类型总结
  • RedisSerializer之JdkSerializationRedisSerializer分析
  • Shell编程
  • spring boot下thymeleaf全局静态变量配置
  • springboot_database项目介绍
  • STAR法则
  • 算法之不定期更新(一)(2018-04-12)
  • 小程序button引导用户授权
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (10)工业界推荐系统-小红书推荐场景及内部实践【排序模型的特征】
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (8)Linux使用C语言读取proc/stat等cpu使用数据
  • (C语言版)链表(三)——实现双向链表创建、删除、插入、释放内存等简单操作...
  • (ISPRS,2021)具有遥感知识图谱的鲁棒深度对齐网络用于零样本和广义零样本遥感图像场景分类
  • (九)c52学习之旅-定时器
  • (四)【Jmeter】 JMeter的界面布局与组件概述
  • (四)汇编语言——简单程序
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • **CI中自动类加载的用法总结
  • .gitignore文件---让git自动忽略指定文件
  • .MSSQLSERVER 导入导出 命令集--堪称经典,值得借鉴!
  • .MyFile@waifu.club.wis.mkp勒索病毒数据怎么处理|数据解密恢复
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .NET NPOI导出Excel详解
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 服务 ServiceController
  • .NET(C#、VB)APP开发——Smobiler平台控件介绍:Bluetooth组件
  • .NET框架
  • .Net中间语言BeforeFieldInit
  • @AutoConfigurationPackage的使用
  • @ModelAttribute注解使用
  • [1] 平面(Plane)图形的生成算法
  • [2023年]-hadoop面试真题(一)