【算法 - 动态规划】划分整数Ⅰ

在前面的动态规划系列文章中,关于如何对递归进行分析的四种基本模型都介绍完了,再来回顾一下:

  1. 从左到右模型arr[index ...]index 之前的不用考虑,只考虑后面的该如何选择
  2. 范围尝试模型 :思考 [L ,R] 两端,即 开头和结尾 处分别该如何取舍。
  3. 样本对应模型 :以 结尾位置 为出发点,思考两个样本的结尾都会产生哪些可能性 。
  4. 业务限制模型 :不能够明确的知道一个参数的变化范围,通过业务的限制找到 最差情况 进行估计。

今天我们通过最熟悉的 从左到右模型 继续学习 消除枚举行为斜率优化问题

整数 N 的裂开Ⅰ

给定一个正整数 N ,求把 N 裂开的方法数有多少种,要求后面的数不能小于前面的数。

示例 1:

输入: N = 4

输出: 5

解释: 共 5 种裂开方式

  • 1, 1, 1, 1
  • 1, 1, 2
  • 1, 3
  • 2, 2
  • 4

首先我们依然采用最朴素的 暴力递归 来思考这道题目。

思路

这道题就是典型的 从左到右模型 ,因此,递归就可以按照: 当前来到的位置之前的不用考虑,只考虑后面的该如何选择 的方式思考。

唯一的限制条件就是不能比前一个数小,因此,我们需要用变量记录 前面的数 是几,以及 后面还剩几 可以给我们裂开。

代码

public static int ways(int n) {if (n <= 0) {return 0;}if (n == 1) {return 1;}return process(1, n);
}public static int process(int pre, int rest) {if (rest == 0) {return 1;}if (pre > rest) {return 0;}int ways = 0;// 保证不小于前一个数for (int one = pre; one <= rest; one++) {ways += process(one, rest - one);}return ways;
}

代码解释

递归中的 base case ,如果当前剩余的数为 0 了,说明前面的组合刚好满足题意,裂完了,记为有效的一种情况。

若上一轮裂开之后,剩余的数字已经小于了 pre ,说明已经没有可以方案了,直接返回 0 。

因为不能比前一个数小,因此直接从上一个数字开始依次增大且不超过剩余值即可。


下面我们通过画 dp 表,探寻如何修改出动态规划版本。

假设 n = 5 。

由递归可知,当 rest 为 0 时,返回 1。另外,当 pre == rest 可以知道,只剩下一种裂开方式,即 rest 作为最后一个数字,不能再裂开了。

  • 例如: pre=2, rest=2。此时的裂开方式只能为 2, 2 。

因此,对角线均为 1 。

pre > rest 时,无结果,返回 0 。

对于一般位置,process(one, rest - one) 中 one 的值逐渐增大,rest-one 的值逐渐减小。即依赖左下的位置:

动态规划版

public static int dp(int n) {if (n <= 0) {return 0;}if (n == 1) {return 1;}int[][] dp = new int[n + 1][n + 1];// 为初始化for (int pre = 1; pre <= n; pre++) {dp[pre][0] = 1;dp[pre][pre] = 1;}// 初始化完毕,倒着填表for (int pre = n - 1; pre >= 1; pre--) {for (int rest = pre + 1; rest <= n; rest++) {int ways = 0;for (int one = pre; one <= rest; one++) {ways += dp[one][rest - one];}dp[pre][rest] = ways;}}// 返回右上角的值return dp[1][n];
}

代码解释

可变的参数有两个:前一个数 pre 和 剩余数 rest 。因此,需要设置一个二维的 dp 表数组,由于 pre, rest 的取值范围均为 0~n ,因此数组大小设置为 dp[n + 1][n + 1] 。第一列和对角线均为 1 。

由上面的例子分析可知,普遍位置依赖左下位置的值,因此可以倒着从下往上,从左到右填写 dp 表。

根据递归调用 process(1, n) 可知最终返回 dp[1][n]


观察递归的代码,发现竟然有 3 层 for 循环。为什么呢?

思考后发现, dp 表中的每个位置同样需要 枚举 后才能知道。那有没有办法消掉这层枚举的 for 循环呢?答案是有的!

下面我们继续观察 dp 表,探寻该动态规划应如何进一步优化。

假设此时 pre=2,rest=5(虽然这种情况在 n=5 时不会发生)。

一图胜千言~

由图可知,dp[2][5] 的值,红色 = 蓝色 + 3 个黄色

蓝色:把 5 裂开一个 2 后,rest=3 。(蓝行 = 红行,蓝列 = 红列 - 红行)。

黄色:裂开 3 剩 2;裂开 4 剩 1;裂开 5 剩 0。

观察发现,紫色 = 3 个黄色

因此,替换一下红色 = 蓝色 + 紫色 。这样就消除了枚举的 for 循环。

最终优化版动态规划

public static int dp(int n) {if (n <= 0) {return 0;}if (n == 1) {return 1;}int[][] dp = new int[n + 1][n + 1];for (int pre = 1; pre <= n; pre++) {dp[pre][0] = 1;dp[pre][pre] = 1;}for (int pre = n - 1; pre >= 1; pre--) {for (int rest = pre + 1; rest <= n; rest++) {// 红色 = 紫色 + 蓝色dp[pre][rest] = dp[pre + 1][rest] + dp[pre][rest - pre];}}// 返回右上角return dp[1][n];
}

相信代码很容易看懂,这样就完成了最终版 斜率优化 后的动态规划~

前面学习的如何一步步的将暴力递归修改为严格表依赖动态规划的基础要打牢哦!还不会的赶快关注一下回顾前面的几篇文章吧!

~ 点赞 ~ 关注 ~ 星标 ~ 不迷路 ~!!!

------------- 往期回顾 -------------
所发博客文章大合集(实时更新)
【算法 - 动态规划】找零钱问题Ⅰ
【算法 - 动态规划】找零钱问题Ⅱ
【算法 - 动态规划】找零钱问题Ⅲ
【算法 - 动态规划】京东面试题 - 洗咖啡杯问题
【堆 - 专题】“加强堆” 解决 TopK 问题!
AC 此题,链表无敌!!!

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【Web】青少年CTF擂台挑战赛 2024 #Round 1 wp

好家伙&#xff0c;比赛结束了还有一道0解web题是吧( 随缘写点wp(简单过头&#xff0c;看个乐就好) 目录 EasyMD5 PHP的后门 PHP的XXE Easy_SQLi 雏形系统 EasyMD5 进来是个文件上传界面 说是只能上传pdf&#xff0c;那就改Content-Type为application/pdf&#xff0c;改…

【学习记录】Resnet

Resnet的残差块 BasicBlock模块&#xff1a; Resnet的作用 解决梯度消失。网络越深&#xff0c;会导致梯度消失。Resnet可以解决梯度消失的问题。 Resnet的原理 参考视频&#xff1a;https://www.bilibili.com/video/BV1cM4y117ob/?spm_id_from333.337.search-card.all.cl…

unity后期

unity|后处理篇 前言一、Post-Processing 1、 Post-Processing的使用2、Post-Processing后处理效果 抗锯齿①、Ambient Occlusion 环境光遮蔽②、Auto Exposure 自动曝光③、Bloom 辉光/泛光④、Chromatic Aberration | 色差⑤、Color Grading 色调/颜色分级⑥、Depth Of Fiel…

css5定位

css 一.定位1.概念&#xff08;定位定位模式边位移&#xff09;2.静态位移static&#xff08;不常用&#xff09;3.相对定位relative&#xff08;不脱标&#xff09;&#xff08;占位置&#xff09;4.绝对定位absolute&#xff08;脱标&#xff09;&#xff08;不占位置&#x…

内网搭建mysql8.0并搭建主从复制详细教程!!!

一、安装mysql 1.1 mysql下载链接&#xff1a; https://downloads.mysql.com/archives/community/ 1.2 解压包并创建相应的数据目录 tar -xvf mysql-8.2.0-linux-glibc2.28-x86_64.tar.xz -C /usr/local cd /usr/local/ mv mysql-8.2.0-linux-glibc2.28-x86_64/ mysql mkdir…

模型选择与评估

&#x1f6a9; 机器学习的一般流程包括&#xff1a;数据集的准备与预处理、搭建模型、模型训练、模型评估与应用。 在现实任务中&#xff0c;我们往往有多种学习算法可供选择&#xff0c;甚至对同一个学习算法&#xff0c;当使用不同的参数配置时&#xff0c;也会产生不同的模型…

IPD MM流程之业务策略工具:安索夫矩阵

IPD市场管理流程&#xff0c;华为内部称为“MM流程”&#xff08;Market Management&#xff0c;MM&#xff09;。华为市场管理是通过对市场和细分市场的分析&#xff0c;制定细分市场的策略&#xff0c;形成商业计划&#xff0c;把商业计划落实在日常工作当中。MM流程其中一个…

bvh文件,人体骨骼重定向

关于两个bvh文件&#xff0c;人体骨骼重定向&#xff0c;小白记录 1、打开 Motionbuilder &#xff0c;选择 打开特定路径下的bvh文件。 绑定骨骼&#xff08;在绑定骨骼过程中&#xff0c;如果骨骼角度&#xff0c;大小之类的不方便&#xff0c;可以shift键加鼠标拖拽界面&…

Fabric V2.5 通用溯源系统——应用后端GIN框架部分设计

本节对Fabric V2.5 通用溯源系统的应用后端部分做一个简单的介绍,包括目录结构、文件作用、用户注册登录与农产品信息上链过程介绍。此节内容免费发布在TrueTechLabs Fabric学习交流QQ群。 购买专栏前请认真阅读:《Fabric项目学习笔记》专栏介绍 TrueTechLabs Fabric学习交流…

仿牛客网项目---显示评论和添加评论功能的实现

这篇文章&#xff0c;我来介绍一下我的项目中的另外一个功能&#xff1a;显示评论和添加评论。 其实这两个功能都不怎么重要&#xff0c;我感觉最重要的应该是用户注册登录功能&#xff0c;这个也了解一下&#xff0c;知道这么一回事儿就好。 首先设计DAO层。 Mapper public …

【一】【算法分析与设计】基础测试

排列式 题目描述 7254是一个不寻常的数&#xff0c;因为它可以表示为7254 39 x 186&#xff0c;这个式子中1~9每个数字正好出现一次 输出所有这样的不同的式子&#xff08;乘数交换被认为是相同的式子&#xff09; 结果小的先输出&#xff1b;结果相同的&#xff0c;较小的乘…

Hgame题解(第二星期)

Hgame题解&#xff08;第二星期&#xff09; Web Select More Courses 打开靶机发现是一个登陆页面&#xff0c;根据题目提示下载弱密码字典&#xff0c;通过BP爆破获得用户密码为qwert123 登陆后进入下一个页面&#xff0c;由于学分已满无法选课&#xff0c;所以需要先进行…

AI也来打掼蛋,难道人工智能也能当领导?

引言&#xff1a;探索AI在复杂卡牌游戏中的决策能力 在人工智能&#xff08;AI&#xff09;的研究领域中&#xff0c;游戏被视为现实世界的简化模型&#xff0c;常常是研究的首选平台。这些研究主要关注游戏代理的决策过程。例如&#xff0c;中国的传统卡牌游戏“掼蛋”&#…

MySql安全加固:无关或匿名帐号是否更改root用户避免空口令用户是否加密数据库密码

MySql安全加固&#xff1a;无关或匿名帐号&是否更改root用户&避免空口令用户 1.1 检查是否删除无关或匿名帐号1.2 检查是否更改root用户1.3 避免空口令用户1.4 检查是否加密数据库密码 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496…

buuctf_misc_荷兰宽带数据泄露+被偷走的文件

荷兰宽带数据泄露 题目&#xff1a; 没啥&#xff0c;工具给大家放这了&#xff0c;这个&#xff08;相对来说&#xff09;比较安全 https://routerpassview.en.lo4d.com/windows 打开后&#xff0c;.bin文件直接托进去 只是我想不到的是&#xff0c;flag这算是username&…

Java多线程算法总结

1. 标题三个线程同时运行&#xff0c;依次打印ABC&#xff0c;一共打印10次 算法代码如下&#xff1a; public class ThreadTest {private Object oa new Object();private Object ob new Object();private Object oc new Object();private static final String TAG &quo…

探索数据结构:解锁计算世界的密码

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty‘s blog 前言 随着应用程序变得越来越复杂和数据越来越丰富&#xff0c;几百万、…

SpringBoot项目连接Redis报错:Connection refused: no further information

今天在使用SpringBoot连接Redis时发生了报错 明明Jedis能够连接成功为什么StringRedisTemplate就不行? 然后在网上找了一下说是关闭防火墙或者修改配置文件但是都不管用 最后发现是Redis在SpringBoot3之后yml的配置方式发生了改变 相较于之前多了一个前缀, 由于我刚开始没有…

配置artifactory的反向代理和域名访问

一、概述 在许多情况下&#xff0c;组织会通过反向代理来提供对 Artifactory 的访问。在某些情况下&#xff0c;例如使用 Artifactory 作为 Docker 注册表&#xff0c;这种设置甚至是强制性的。为了简化反向代理的配置&#xff0c;Artifactory 提供了生成反向代理的功能&#x…

机器视觉中的图像传感器:CCD与CMOS的比较与应用

在机器视觉领域&#xff0c;图像传感器的作用至关重要&#xff0c;它们负责将捕获的光信号转换成电信号&#xff0c;进而被计算机系统分析和处理。目前市场上主要有两种类型的图像传感器&#xff1a;电荷耦合器件&#xff08;CCD&#xff09;和互补金属氧化物半导体&#xff08…