剑指offer13_剪绳子

news2025/6/4 13:39:22

剪绳子


给你一根长度为 n 绳子,请把绳子剪成 m 段(m、n都是整数,2≤n≤58 并且 m≥2)。

每段的绳子的长度记为 k[1]、k[2]、……、k[m]。

k[1]k[2]…k[m] 可能的最大乘积是多少?

例如当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到最大的乘积 18。

样例
输入:8

输出:18

整数拆分最大乘积问题(数学归纳与证明)

问题描述

给定正整数 N ≥ 2 N \geq 2 N2,将其拆分为若干正整数的和:
N=n1​+n2​+⋯+n**k​(k≥2)
求最大化乘积 P = n 1 × n 2 × ⋯ × n k P = n_1 \times n_2 \times \cdots \times n_k P=n1×n2××nk

数学证明

引理1:拆分中不含1

若存在 n i = 1 n_i = 1 ni=1,设剩余部分和为 S S S,则乘积 P = 1 × S = S P = 1 \times S = S P=1×S=S
S = N − 1 S = N-1 S=N1,而直接拆分 N = ( N − 1 ) + 1 N = (N-1) + 1 N=(N1)+1 的乘积为 N − 1 < N N-1 < N N1<N
矛盾!故拆分中不含1

引理2:拆分中不含≥5的数

若存在 n i ≥ 5 n_i \geq 5 ni5,将其拆分为 3 + ( n i − 3 ) 3 + (n_i-3) 3+(ni3)
3×(ni−3)=3ni−9>ni(∵ni≥5⇒2ni>9)
新拆分乘积更大,矛盾!故拆分中不含≥5的数

引理3:拆分中不含4

若存在 n i = 4 n_i = 4 ni=4,可拆分为 2 + 2 2 + 2 2+2
2×2=4=ni​
乘积不变但增加拆分项数,为后续优化创造条件

引理4:至多两个2

若有三个2( 2 × 2 × 2 = 8 2 \times 2 \times 2 = 8 2×2×2=8),替换为两个3:
3×3=9>8
乘积更大,故拆分中至多两个2

定理:最优解结构

由引理1-4,最优拆分仅含 23,且满足:

  1. 3 3 3 的数量尽可能多
  2. 2 2 2 的数量为 0, 1, 2
  3. 当余数为1时,需将一组 3 + 1 3+1 3+1 替换为 2 + 2 2+2 2+2

构造性证明

N = 3 k + r N = 3k + r N=3k+r,其中 r = N m o d    3 ∈ 0 , 1 , 2 r = N \mod 3 \in {0,1,2} r=Nmod30,1,2

r r r拆分方案最大乘积
0 k k k 3 3 3 3 k 3^k 3k
1 ( k − 1 ) (k-1) (k1) 3 3 3 + 2 2 2 2 2 2 3 k − 1 × 4 3^{k-1} \times 4 3k1×4
2 k k k 3 3 3 + 1 1 1 2 2 2 3 k × 2 3^k \times 2 3k×2

特殊边界处理

  • N = 2 N=2 N=2:强制拆分为 1 + 1 1+1 1+1(乘积1)
  • N = 3 N=3 N=3:强制拆分为 1 + 2 1+2 1+2(乘积2)

时间复杂度分析

  1. 计算 k = ⌊ N / 3 ⌋ k = \lfloor N/3 \rfloor k=N/3 O ( 1 ) O(1) O(1)
  2. 计算余数 r = N m o d    3 r = N \mod 3 r=Nmod3 O ( 1 ) O(1) O(1)
  3. 乘积计算:
    • 直接公式计算: O ( 1 ) O(1) O(1)
    • 若模拟拆分过程: O ( k ) = O ( N / 3 ) = O ( N ) O(k) = O(N/3) = O(N) O(k)=O(N/3)=O(N)

数学解释

为什么是3?

函数 f ( x ) = ( N / x ) x f(x) = (N/x)^x f(x)=(N/x)x 的极大值点在 x = N / e x = N/e x=N/e 附近
∵ e ≈ 2.718 ⇒ \because e \approx 2.718 \Rightarrow e2.718 最接近整数为3

数值验证

N N N最优拆分乘积公式计算
2 1 + 1 1+1 1+111
3 1 + 2 1+2 1+222
4 2 + 2 2+2 2+244
5 2 + 3 2+3 2+366
6 3 + 3 3+3 3+399
7 3 + 2 + 2 3+2+2 3+2+21212
8 3 + 3 + 2 3+3+2 3+3+21818
9 3 + 3 + 3 3+3+3 3+3+32727
10 3 + 3 + 2 + 2 3+3+2+2 3+3+2+23636

扩展思考

  1. 连续实数拆分:当拆分数 k → ∞ k \to \infty k,乘积收敛于 e N / e e^{N/e} eN/e
  2. 约束拆分:若限定 n i ≤ m n_i \leq m nim,问题转化为背包问题
  3. 几何解释:在 ∑ n i = N \sum n_i = N ni=N 约束下求 ∏ n i \prod n_i ni 极大值,最优解位于均值附近

题解

class Solution {
public:
    int maxProductAfterCutting(int n) {
        if(n <= 3) return 1 * (n - 1);
        
        int res = 1;
        if(n % 3 == 1) res = 4, n -= 4;
        if(n % 3 == 2) res = 2, n -= 2;
        while(n) res *= 3, n -= 3;
        
        return res;
    }
};

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

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

相关文章

reverse_ssh 建立反向 SSH 连接指南 混淆AV [好东西哟]

目录 &#x1f310; 工具简介 ⚙️ 前提条件 攻击主机 (Linux) 目标主机 (Windows) &#x1f4cb; 详细步骤 步骤 1&#xff1a;安装 Go 环境 步骤 2&#xff1a;安装必要依赖 步骤 3&#xff1a;下载并编译 reverse_ssh 步骤 4&#xff1a;配置密钥 步骤 5&#xff…

lvs-keepalived高可用群集

目录 1.Keepalived 概述及安装 1.1 Keepalived 的热备方式 1.2 keepalived的安装与服务控制 &#xff08;1&#xff09;安装keep alived (2)控制 Keepalived 服务DNF 安装 keepalived 后,执行以下命令将keepalived 服务设置为开机启动。 2.使用 Keepalived 实现双机热备 …

高速收发器

一、高速收发器 1.FPGA高速收发器&#xff1a;GTP,GTX,GTH,GTZ 2.每个Quad有4对高速收发器GT(4个TX和4个RX)和一个COmmon 3.走差分&#xff0c;提高抗干扰性 4.CPLL是每个lane私有的&#xff0c;QPLL是整个Quad的所有通道共享的 5.每个MGT的bank有两对差分参考时钟 6.CPLL的时钟…

webpack的安装及其后序部分

npm install原理 这个其实就是npm从registry下载项目到本地&#xff0c;没有什么好说的 值得一提的是npm的缓存机制&#xff0c;如果多个项目都需要同一个版本的axios&#xff0c;每一次重新从registry中拉取的成本过大&#xff0c;所以会有缓存&#xff0c;如果缓存里有这个…

如何利用自动生成文档工具打造出色的技术文档

文章目录 每日一句正能量前言一、自动生成文档工具的优势&#xff08;一&#xff09;提高效率&#xff08;二&#xff09;保持一致性&#xff08;三&#xff09;实时更新 二、常见的自动生成文档工具&#xff08;一&#xff09;Sphinx&#xff08;二&#xff09;Javadoc&#x…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.7 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.7 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图&#xff0c;等值线图。 dataframe <-data.frame…

OpenCv高阶(二十)——dlib脸部轮廓绘制

文章目录 一、人脸面部轮廓绘制代码实现1、定义绘制直线段的函数2、定义绘制凸包轮廓的函数3、读取输入图像4、初始化dlib的人脸检测器5、使用检测器在图像中检测人脸&#xff08;参数0表示不进行图像缩放&#xff09;6、加载dlib的68点人脸关键点预测模型7、遍历检测到的每个人…

pikachu靶场通关笔记08 XSS关卡04-DOM型XSS

目录 一、XSS原理 二、DOM型XSS 三、源码分析 1、进入靶场 2、XSS探测 3、源码分析 四、渗透实战 1、Payload1 2、Payload2 3、Payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff0c;通过对XSS关卡源码的代码审计找到XSS风…

Spring AI 系列之使用 Spring AI 开发模型上下文协议(MCP)

1. 概述 现代网页应用越来越多地集成大型语言模型&#xff08;LLMs&#xff09;来构建解决方案&#xff0c;这些解决方案不仅限于基于常识的问答。 为了增强 AI 模型的响应能力&#xff0c;使其更具上下文感知&#xff0c;我们可以将其连接到外部资源&#xff0c;比如搜索引擎…

[Python] Python运维:系统性能信息模块psutil和系统批量运维管理器paramiko

初次学习&#xff0c;如有错误还请指正 目录 系统性能信息模块psutil 获取系统性能信息 CPU信息 内存信息 磁盘信息 网络信息 其他信息 进程信息 实用的IP地址处理模块IPy IP地址、网段的基本处理 多网络计算方法 系统批量运维管理器paramiko paramiko 的安装 Li…

Linux 简单模拟实现C语言文件流

&#x1f307;前言 在 C语言 的文件流中&#xff0c;存在一个 FILE 结构体类型&#xff0c;其中包含了文件的诸多读写信息以及重要的文件描述符 fd&#xff0c;在此类型之上&#xff0c;诞生了 C语言 文件相关操作&#xff0c;如 fopen、fclose、fwrite 等&#xff0c;这些函数…

小程序使用npm包的方法

有用的链接 npm init -y 这个命令很重要, 会初始化 package.json 再重新打开微信小程序开发工具 选择工具中npm构建 在程序中引用时在main.js中直接使用包名的方式引用即可 如安装的是generator包&#xff0c;npm构建后就会生成 const myPackage require(***-generato…

Rust 学习笔记:发布一个 crate 到 crates.io

Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io Rust 学习笔记&#xff1a;发布一个 crate 到 crates.io提供有用的文档注释常用标题文档注释作为测试注释所包含的项目 使用 pub use 导出一个方便的公共 API设置 crates.io 账户添加 metadata 到一个新的 crate发布到 c…

Vert.x学习笔记-EventLoop与Context的关系

Vert.x学习笔记 1. EventLoop 的核心作用2. Context 的核心作用3. EventLoop 与 Context 的关系1. 事件循环&#xff08;EventLoop&#xff09;的核心职责2. 上下文&#xff08;Context&#xff09;的核心职责3. 事件循环与上下文的关系&#xff08;1&#xff09;一对一绑定&am…

2025030给荣品PRO-RK3566开发板单独升级Android13的boot.img

./build.sh init ./build.sh -K ./build.sh kernel 【导入配置文件】 Z:\Android13.0\rockdev\Image-rk3566_t\config.cfg 【更新的内核】 Z:\Android13.0\rockdev\Image-rk3566_t\boot.img 【导入分区表&#xff0c;使用原始的config.cfg会出错的^_】 Z:\Android13.0\rockdev\…

由enctype-引出post与get的关系,最后深究至请求/响应报文

本篇载自我的笔记&#xff0c;本次为第二次复习。我觉得我有能力理一下思路了。 --- 笔记截图。 enctype HTML 表单的 enctype&#xff08;Encode Type&#xff0c;编码类型&#xff09;属性用于控制表单数据在提交到服务器时的编码方式&#xff0c;不同取值的详细解析如下&a…

搭建基于VsCode的ESP32的开发环境教程

一、VsCode搜索ESP-IDF插件 根据插件处搜索找到ESP-IDF并安装 安装完成 二、配置安装ESP-IDF 配置IDF 按照如下配置&#xff0c;点击安装 安装完成 三、使用案例程序 创建一个闪光灯的例子程序&#xff0c;演示程序编译下载。 选择blink例子&#xff0c;闪烁LED的程序 选…

【MFC】初识MFC

目录 01 模态和非模态对话框 02 静态文本 static text 01 模态和非模态对话框 首先我们需要知道模态对话框和非模态对话框的区别&#xff1a; 模态对话框是一种阻塞时对话框&#xff0c;它会阻止用户与应用程序的其他部分进行交互&#xff0c;直到用户与该对话框进行交互并关…

如何通过数据分析优化项目决策

通过数据分析优化项目决策需从明确数据分析目标、选择适当的数据分析工具、确保数据质量、建立数据驱动文化等方面入手&#xff0c;其中&#xff0c;明确数据分析目标是优化决策过程的基础&#xff0c;只有清晰明确的数据分析目标才能指导有效的数据采集与分析&#xff0c;避免…

2024年数维杯国际大学生数学建模挑战赛B题空间变量协同估计方法研究解题全过程论文及程序

2024年数维杯国际大学生数学建模挑战赛 B题 空间变量协同估计方法研究 原题再现&#xff1a; 在数理统计学中&#xff0c;简单采样通常假设来自相同总体的采样点彼此独立。与数理统计相反&#xff0c;空间统计假设空间变量的采样点是相依的&#xff0c;并在其值中表现出某些趋…