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

算法学习笔记之递推求解

重点学习:如何把一个大问题分解为几个小问题

导引

我们可以写出上面和下面的公式

例1

n=1 f(n) = 2

n=2 f(n) = 4

n=3 f(n) = 7

......

假设平面上已经有n-1条直线,则第n条直线会与剩下的n-1条之间有n-1个交点,这n-1个焦点将第n条直线划分为了n段,每一段会将一个区域分成两块,于是我们可以写出状态转移方程:f(n) = f(n-1) + n

化简后变成f(n) = n(n+1)/2 + 1

例2

f(1) = 2

f(2) = 7

......

假设平面上已经有n-1条折线,则第n条折线会与剩下的n-1条之间有4(n-1)个交点,这n-1个焦点将第n条折线划分为了4(n-1)+1段,每一段会将一个区域分成两块,于是我们可以写出状态转移方程:f(n) = f(n-1) + 4(n-1) + 1

例3

f(1) = 1

f(2) = 2

f(3) = 3

......

在2xn的长方形方格中,若第一行的最后一个方格(1,n)是竖着铺,则前面的2x(n-1)的长方形方格有f(n-1)种铺设方式;若第一行的最后一个方格(1,n)是横着铺,则前面的2x(n-2)的长方形方格有f(n-2)种铺设方式。故2xn的长方形方格共有f(n-1)+f(n-2)种铺放方式。

可以写出状态转移方程f(n) = f(n-1) + f(n-2)

例4

类比上一例,

若最后一个方格铺1x1,则前面n-1个方格有f(n-1)种铺法;

若最后一个方格铺1x2,则前面n-2个方格有f(n-2)种铺法;

若最后一个方格铺1x3,则前面n-3个方格有f(n-3)种铺法;

我们可以写出状态转移方程:f(n) = f(n-1) + f(n-2) + f(n-3)

总结:递推求解的基本方法

1.确认:能否容易的得到初始状态的解

2.假设:规模不大于N-1的状态已经得到解决

3.重点分析:当规模扩大到N时,如何枚举出所有的情况,然后用子问题的状态表示出最后的状态F(N)

例5

一个学校的校长想要让学生排成一列,但是他又不想女生单独站队,请给出n个学生可能的站队数量

分析1:

若最后一位同学是男生,前面n-1位同学任意站队,若前面n-1位同学站队合法,则有f(n-1)种可能,若不合法,则有0种可能

若最后一位同学是女生,则她前面一个同学一定是女生,前面n-2位同学任意站队,若前面n-2位同学站队合法,则有f(n-2)种可能,若不合法,当其最后一名同学是女生且其前一名同学是男生时,依旧可以合法,此时有f(n-4)种可能。

分析2:

采用二维数组保存站队,0表示最后一名同学是女生,1表示最后一名同学是男生,f(n)表示合法的全部数量,f(n, 1)表示合法的最后一个是男生的数量,f(n, 0) 表示合法的最后一个是女生的数量,则有f(n)=f(n, 0) + f(n, 1)

f(n, 0) = f(n-1, 0) + f(n-2, 1)

f(n, 1) = f(n-1, 1) + f(n-1, 0)

延申:有一个由a,b,c组成的字符串,a不能在b后面,b不能在c后面,计算能组成多少个字符串

分析:采用二维数组保存以字符x结尾的字符串,1表示a,2表示b,3表示c,则能组成f(n)=f(n, 1) + f(n, 2) + f(n, 3)个字符串

f(n, 1) = f(n-1, 1) + f(n-1, 3)

f(n, 2) = f(n-1, 2) + f(n-1, 1)

f(n, 3) = f(n-1)

例6

若第n-1个元素和第一个元素同色,则第n-2个元素和第一个元素肯定不同色(因为之前的序列都是合法的),那么最后一个元素有两种选法,则这种情况的数量为2*f(n-2)

若第n-1个元素和第一个元素不同色,则最后一个格子只有一种选法,故这种情况数量为f(n-1)

例7(卡特兰数)

假设在地上按照顺时针方向依次写下2n个数字1,2,3,4…2n围成一个圆,然后用n条直线连接这2n个数字,每个数字都和一个数字相连,并且仅仅和一个数字相连。要求所有的连线都不能有交点。

请计算一共有多少种不同的连线方式。

思路:

对于数字1,当其与其他2n-1个数连接时,若与奇数连接时,可以发现一定会出现交点。也就是数字1只能与偶数连接。当连接2时,显然有f(n-1)种方法,当连接4时,将2n个数分成了两半,其中一半为f(1),另一半为f(n-2),同理,我们可以写出该公式:f(n) = f(n-1) + f(1) * f(n-2)+ ...... + f(n-2)*f(1) + f(n-1)。

显然这是一个卡特兰数

卡特兰数前面若干项分别为:1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786....

公式为:\frac{C_{2n}^n }{n+1}
 

相关文章:

  • (LLaMa Factory)大模型训练方法--监督微调(Qwen2-0.5B)
  • 利用多线程加速ESMC-6B模型API调用以及403Forbidden问题的解决
  • Redis数据结构总结-整数集合
  • 创建虚拟机遇到的问题
  • Mybatis MyBatis框架的缓存 一级缓存
  • Fino1: 关于推理增强型大型语言模型在金融领域的可迁移性
  • stable diffusion 人物高级提示词(四)朝向、画面范围、远近、焦距、机位、拍摄角度
  • 手写简易RPC(实践版)
  • 【关于电商数据采集】电商数据采集的市场应用及发展
  • golang深度学习-基础篇
  • Ubuntu 20.04源码安装opencv 4.5.0
  • 爬取网站内容转为markdown 和 html(通常模式)
  • 代码随想录-- 第一天图论 --- 岛屿的数量
  • ArcGis和Super Map
  • 接入DeepSeek后,智慧园区安全调度系统的全面提升
  • 怎样从零基础开始学习大模型
  • Vue2/Vue3自定义指令
  • 从零开始构建一个语言模型中vocab_size(词汇表大小)的设定规则
  • v4l2子系统学习(一)V4L2应用程序编程
  • Python3测试开发面试题2
  • 乌美矿产协议文本公布,明确乌收益及协议优先级
  • 韩国代总统、国务总理韩德洙宣布辞职
  • 视频丨英伟达总裁黄仁勋:美勿幻想AI领域速胜中国
  • 澎湃读报丨解放日报8个版聚焦:牢记嘱托,砥砺奋进
  • 网商银行2024年年报发布,客户资产管理规模超过1万亿
  • “80后”杨占旭已任辽宁阜新市副市长,曾任辽宁石油化工大学副校长