【算法-动态规划】通用模板

这篇具有很好参考价值的文章主要介绍了【算法-动态规划】通用模板。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、动态规划是什么?

二、通用思路

2-1、状态的定义

2-2、状态转移方程

2-3、遍历顺序

2-4、初始化

2-5、结果输出

2-6、优化

2-6-1 空间的优化

2-6-2 递归实现VS迭代实现(数组存储)


一、动态规划是什么?

动态规划(DP),即将问题不断转化为子问题,再通过子问题的求解,解决问题。

如下:

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

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

经过分析,可以得到 F(n)=F(n-1)+F(n-2) 这个我们称之为状态转移方程

即,楼顶有n个台阶,每次可以爬1个或2个,问题可以转化为 n-1个台阶的不同方法(对应下一步爬1个台阶),加上n-2个台阶的不同方法(对应下一步爬2个台阶)。

当只有0个台阶,那么只有0中方法,即F(0)=0

当只有1个台阶,那么只有1种方法,即F(1)=1

当只有2个台阶,那么只有2种方法,即F(2)=2

当只有3个台阶,那么只有F(3)=F(2)+F(1)=2+1=3 

当有n个台阶,那么有F(n)=F(n-1+F(n-2) 种走法。

可以发现,除了0个台阶,其它的都符合我们的推理。

动态规划的难点在于,如何找出状态转移方程,当找到状态转移方程,问题迎刃而解。

因为F(n)依赖于F(n-1)和F(n-2) 所以我们必须将F(n-1)和F(n-2)的值存储下来,常用的方式是定义一个数组,如

int[] dp =new int[n+1];

二、通用思路

下面以上面的题目,尝试将动态规划的步骤拆解

2-1、状态的定义

dp[i] 为 i 个台阶,一共有多少种走法

2-2、状态转移方程

根据上面,状态转移方程为 dp[i]=dp[i-1]+dp[i-2]

2-3、遍历顺序

可以看到,对于 i 依赖于 i-1 和 i-2 ,即前面2个值

所以是后面依赖前面,顺序应该是正序

2-4、初始化

正序遍历,且需要前2个值,初始化dp数组,至少需要两个值,dp[0]为特殊情况,单独处理,所以我们至少需要提前设置

dp[1]=1;
dp[2]=2;

2-5、结果输出

对于n个台阶的最大走法,结果显然为 dp[n]

2-6、优化

2-6-1 空间的优化

可以看到,上述问题使用了一个dp数组,但是实际使用中,我们只需要2个变量就可以替代掉数组的作用,即空间上可以把 优化为

实际操作中,01背包问题,经常会通过二维的dp数组,压缩为一维的dp数组

注意事项:优化空间的过程,不能导致状态值的丢失。

2-6-2 递归实现VS迭代实现(数组存储)

既然是问题转化为子问题求解,显然递归是一个好方式,但是受限于栈的大小以及可开辟的缓存空间,可灵活考虑是使用递归实现,还是迭代实现。

如LeetCode上的一些题目,使用递归,会栈溢出,就只能使用迭代实现,另一些题目,要求空间复杂度在,可考虑递归实现。文章来源地址https://www.toymoban.com/news/detail-793202.html

到了这里,关于【算法-动态规划】通用模板的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【动态规划之完全背包问题】完全背包问题的通用解法与优化

    ⭐️ 前面的话 ⭐️ 本篇文章将介绍动态规划中的背包问题——完全背包问题,前面我们已经介绍了0-1背包问题,其实完全背包问题就只改了0-1背包问题的一个条件,即物品可选择次数由一次改为无数次,仅此而已,下面我们就来开始介绍完全背包问题。 📒博客主页:未见

    2023年04月22日
    浏览(50)
  • 动态规划之最长公共子序列模板

    夏令营:动态规划特训 - 【算法模板题】最长公共子序列 - 蓝桥云课 (lanqiao.cn) 我们来解释一下状态转移方程吧。 dp[i][j]的含义是第i个和第j个字符,i与j的下标从1开始,代表着原子符串的第一个字符。那么理所当然字符串a的第0个字符和字符串b的0个字符的公共长度为0.如果字

    2024年02月12日
    浏览(46)
  • 【动态规划】最强最详细的思路及模板(C++)

    本文根据力扣动态规划精讲(一)(二)(三)的框架编写。 动态规划精讲(一) - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 目录 一 动态规划问题的特征 1.1 重叠子问题:子问题反复出现(递归树可以很清晰地看出) 1.2 最优子结构 1.3 贪心和动态规划的区别

    2024年02月08日
    浏览(32)
  • 【算法】动态规划 ⑧ ( 动态规划特点 )

    求解类型 : 动态规划 必须是求 最值 , 可行性 , 方案数 , 三者之一 , 如果求其它内容 , 则不能使用动态规划算法 ; 求最值 : 最大值 , 最小值 等 ; 大规模问题的结果 由 小规模问题 的计算结果 取最大值 大规模问题的结果 由 小规模问题 的计算结果 取最小值 可行性 : 是否可行

    2023年04月08日
    浏览(48)
  • 【算法 - 动态规划】原来写出动态规划如此简单!

    从本篇开始,我们就正式开始进入 动态规划 系列文章的学习。 本文先来练习两道通过 建立缓存表 优化解题过程的题目,对如何将 递归函数 修改成 动态规划 的流程有个基本的熟悉。 用最简单的想法完成题目要求的 递归 函数; 定义明确 递归函数 的功能!!! 分析是否存

    2024年02月21日
    浏览(48)
  • 60题学会动态规划系列:动态规划算法第三讲

    简单多状态问题 文章目录 一.按摩师 二.打家劫舍系列 三.删除并获得点数 四.粉刷房子 力扣链接:力扣 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,

    2024年02月08日
    浏览(49)
  • 【算法】动态规划 ① ( 动态规划简介 | 自底向上的动态规划示例 | 自顶向下的动态规划示例 )

    动态规划 , 英文名称 Dynamic Programming , 简称 DP , 不是具体的某种算法 , 是一种算法思想 ; 具体的算法都有具体的步骤 , 如 : 二分法 , 其 有固定的解决步骤 , 先取一个中心点 , 判断解在左边还是右边 , 然后在一边再取一个中心点 , 再进行判定 , 该算法有具体的步骤 ; 动态规划

    2024年01月16日
    浏览(46)
  • 60题学会动态规划系列:动态规划算法第四讲

    买卖股票相关的动态规划题目 文章目录 1. 买卖股票的最佳时机含冷冻期 2. 买卖股票的最佳时期含⼿续费 3. 买卖股票的最佳时机III 4. 买卖股票的最佳时机IV 力扣链接:力扣 给定一个整数数组 prices ,其中第    prices[i]  表示第  i  天的股票价格 。​ 设计一个算法计算出最

    2024年02月13日
    浏览(36)
  • 60题学会动态规划系列:动态规划算法第五讲

    子数组系列题目 文章目录 1.最大子数组和 2.环形子数组的最大和 3.乘积最大数组 4.乘积为正数的最长子数组长度 5.等差数列划分 6.最长湍流子数组 7.单词拆分 8.环绕字符串中唯一的子字符串 力扣链接:力扣 给你一个整数数组  nums  ,请你找出一个具有最大和的连续子数组(

    2024年02月15日
    浏览(69)
  • 60题学会动态规划系列:动态规划算法第一讲

    坚持就是胜利 - -  文章目录 1.第N个泰波那切数 2.三步问题 3.使用最小花费爬楼梯 4.解码方法 力扣链接:力扣 泰波那契序列 Tn 定义如下:  T0 = 0, T1 = 1, T2 = 1, 且在 n = 0 的条件下 Tn+3 = Tn + Tn+1 + Tn+2 给你整数  n ,请返回第 n 个泰波那契数 Tn 的值。  首先我们分析一下

    2024年02月06日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包