动态规划&贪婪算法之剪绳子

python面试题:Python 剪绳子的多种思路实现(动态规划和贪心) @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 这篇文章主要介绍了Python 剪绳子的多种思路实现(动态规划和贪心),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 剑指Offer(Python多种思路实现):剪绳子 面试14题: 题目:剪绳子 题:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数... 阅读详情
  •     动态规划算法是通过拆分问题,定义问题状态和状态之间的关系,使得问题能够以递推(或者说分治)的方式去解决。

1. 可以使用动态规划的情形:

(1)在应用动态规划之前,要分析能否把大问题分解成小问题,分解后的小问题也存在最优解;如果把小问题的最优解组合起来能够得到整个问题的最优解,那么就可以应用动态规划解决这个问题。

(2)如果是求一个问题的最优解(通常是求最大值或者最小值),而且该问题能否分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划解决这个问题。

2. 动态规划求解问题的特点:

(1)求解一个问题的最优解;

(2)整体问题的最优解是依赖各个子问题的最优解;

(3)将整体问题分解成若干个子问题,这些子问题之间还有相互重叠的更小的子问题;

(4)从上往下分析问题,从下往上求解问题。

  •      贪婪算法(又称贪心算法),指在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,它所做出的是在某种意义上的局部最优解。

当我们在应用贪婪算法解决问题时,每一步都可以做出一个贪婪的选择,基于这个选择,我们确定能够得到最优解。

动态规划&贪婪算法经典例题:剪绳子

题目:给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n>1并且m≥1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0]*k[1]*…*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。

(1)动态规划解法:

int maxProductAfterCutting_solution1(int length)
{
    if(length < 2)
        return 0;
    if(length == 2)
        return 1;
    if(length == 3)
        return 2;

    int* products = new int[length + 1];
    products[0] = 0;
    products[1] = 1;
    products[2] = 2;
    products[3] = 3;

    int max = 0;
    for(int i = 4; i <= length; ++i)
    {
        max = 0;
        for(int j = 1; j <= i / 2; ++j)
        {
            int product = products[j] * products[i - j];
            if(max < product)
                max = product;

            products[i] = max;
        }
    }

    max = products[length];
    delete[] products;

    return max;
}

(2)贪婪算法解法:

int maxProductAfterCutting_solution2(int length)
{
    if(length < 2)
        return 0;
    if(length == 2)
        return 1;
    if(length == 3)
        return 2;

    // 尽可能多地减去长度为3的绳子段
    int timesOf3 = length / 3;

    // 当绳子最后剩下的长度为4的时候,不能再剪去长度为3的绳子段。
    // 此时更好的方法是把绳子剪成长度为2的两段,因为2*2 > 3*1。
    if(length - timesOf3 * 3 == 1)
        timesOf3 -= 1;

    int timesOf2 = (length - timesOf3 * 3) / 2;

    return (int) (pow(3, timesOf3)) * (int) (pow(2, timesOf2));
}

 

《剑指offer》面试题14:剪绳子问题 --- 看完就懂了 这一类的问题,有2种不同的方式来解决, 一个是动态规划, 还有一个是贪婪算法。具体的教程网上有很多, 这里主要是从数学的角度对贪婪算法做一个补充说明。 话不多说,题目先甩为敬意! 题目: 给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n&amp;amp;amp;amp;amp;amp;amp;amp;gt;1并且m&amp;amp;amp;amp;amp;amp;amp;amp;gt;1)每段绳子的长度记为k[0],k[1],…,k[m].请问k[0]k[1]…*k[m]可能的最大乘积是多少? 阅读详情

相关推荐

将一维数据(序列)转化为二维数据(图像)的方法汇总GAFS, MTF, Recurrence plot,STFT

虽然深度学习方法(1D CNN, RNN, LSTM 等)可以直接处理一维数据,但是当前的深度学习方法主要还是处理二维结构数据的,特别是在计算机视觉CV以及自然语言处理NLP领域,各种各样的方法层出不穷。因此,如果能够将一维序列数据转化为二维(图像)数据, 则可以直接结合CV以及NLP领域的方法,是不是很有趣! GAF, GASF, GADF, MTF, Recurrence Plot, STFT, 短时傅里叶变换

MasterQKK 5万+

剪绳子(动态规划、贪心算法)

一、前言 《剑指Offer》中题14 二、题目 给你一根长度为n的绳子,请把绳子剪成m段(m、n都是整数,n&gt;1并且m&gt;1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0] X k[1] X ... X k[m]。可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 三、思路 第一...

行走 4011

图解B树的原理及操作

本文主要参考:https://blog.youkuaiyun.com/shenchaohao12321/article/details/83243314 1. B树 1.1 B树的定义 B树也称B-树,它是一颗多路平衡查找树。我们描述一颗B树时需要指定它的阶数,阶数表示了一个结点最多有多少个孩子结点,一般用字母m表示阶数。当m取2时,就是我们常见的二叉搜索树。 一颗m阶的B树定义如下: 1)每个结点最多有m-1个关键字。 2)根结点最少可以只有1个关键字。 3)非根结点至少有Math.ceil(m/2)-

jinking01的专栏 3万+

剪绳子(贪心算法与动态规划)

题目:给你一根长度为n的绳子,请把绳子剪成m段(n、m都是整数,n&gt;1并且m&gt;1),每段绳子的长度记为k[0],k[1],...,k[m]。请问k[0] x k[1] x ... xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积是18。 一、动态规划: 1、想要长度为n的绳子剪掉后的最大乘积,可以从前面比n小的绳子转移而来 2、用一个dp数组记录从0到n长度的绳子剪掉后的最大乘积,也就是dp[i]表示长度为i的绳子剪成m段

weixin_44196561的博客 817

Meta-World环境实战解析:pick-place-v2中的状态观测与动作控制

本文深入解析了Meta-World中pick-place-v2环境的强化学习实战要点。文章详细拆解了39维状态观测向量的构成与意义,包括机械臂末端、物体位置及目标坐标,并揭示了默认部分可观测设置的潜在影响。同时,阐述了4维动作空间的控制逻辑与奖励函数的分阶段设计,为训练高效稳定的抓放策略提供了核心指导与实用调优技巧。

weixin_29184371的博客 77

深入解析SSD报错“READ FPDMA QUEUED”:从诊断到修复全流程

本文深入解析了SSD报错“READ FPDMA QUEUED”的含义、成因与全流程解决方案。该错误通常指示硬盘硬件或健康状态问题。文章详细介绍了如何通过系统日志定位错误、解读关键的S.M.A.R.T.健康报告(重点关注重分配扇区计数等指标),并逐步进行硬件排查(如更换SATA数据线)、软件修复与数据抢救,最终指导用户根据诊断结果做出维修或更换SSD的决策。

weixin_29233333的博客 398

动态规划-剪绳子问题

题目 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n&gt;1并且m&gt;1),每段绳子的长度记为k[0],k[1],…,k[m-1]。请问k[0]×k[1]×…×k[m]可能的最大乘积是多少? 例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 题目解析 首先题目描述并不是很清楚,我看了一下,比较准确的描述是,绳子分成m个部分,也就是m段。 默认的条件是 绳子不能不被分割,也就是至少被分为两个部分 m、n都是整数,n&gt;1并且m&gt

工程师小星星 3058

KVM — 与 QEMU 和 Libvirt 的关系

目录目录 前言 KVM QEMU KVM 与 QEMU qemu-kvm Libvirt Libvirt 在 OpenStack 中的应用前言如果是刚开始接触虚拟机技术的话, 对上述的概念肯定会有所混淆, 傻傻的分不清. 尤其在看虚拟化技术文档时导致理解能力下降, 所以在开始学习虚拟化技术之前对这些概念有一个整体的认识和清晰的理解, 就显得很有必要了.KVMKVM(Kernel-basedVirtu

烟云的计算 5737

剪绳子(动态规划、贪婪算法)

题目描述 给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n&gt;1并且m&gt;1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 动态规划: 求一个问题的最优解(通常是求最大值或者最小值),而且该问题能够分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划来解决这个问题。 应用动态规划之前要分析能否把大

weixin_42060519的博客 326

【气候极端指数】MATLAB计算各种气候极端指数

简介各类气候极端指数,及其MATLAB计算代码

WW、forever的博客 4917

PCL 计算点云AABB包围盒的体积【2026最新版】

AABB包围盒又称了 轴对齐包围盒,是点云包围盒里最简单的一种,其计算方法也极其简单。获取包围盒之后,根据包围盒的长宽高进行体积计算即可!博客长期更新,本文最近一次更新时间为:2026年5月3日。

点云侠的博客 2295

剪绳子问题(贪心算法)

内容: 给定一根长度为n的绳子,请把绳子剪成m段,每段绳子记为k[0],k[1]……k[m]。请问k[0]*k[1]……*k[m]可能的最大乘积是多少?例如:当绳子长度为8时,我们把它剪成长度分别为2,3,3段,此时最大乘积为18. 代码实现: ...

qq_41613496的博客 3415

YOLOv11改进策略【卷积层】| arXiv 2025 YOLO-Master中的稀疏混合专家ES-MoE 动态路由提适配 + 稀疏激活降延迟,突破精度-效率权衡

ES-MoE(Efficient Sparse Mixture-of-Experts)是为解决传统YOLO类实时目标检测器的静态计算冗余问题而提出的稀疏混合专家模块。现有YOLO架构对所有输入场景采用统一的密集计算模式,导致简单场景资源浪费、复杂场景(如密集小目标、遮挡场景)计算不足,难以平衡检测精度与推理速度。ES-MoE引入实例条件自适应计算,通过动态路由机制为不同复杂度的输入分配差异化计算资源,突破传统静态架构的精度-效率权衡限制,同时适配实时检测的轻量化需求。

Limiiiing的博客 463

《剑指offer》面试题14:剪绳子(动态规划、贪婪算法)

更多剑指offer面试习题请点击: 《剑指offer》(第二版)题集目录索引 题目: 给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n&amp;gt;1并且m&amp;gt;1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。k[0] * k[1]*…*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。 解题思路:...

Tianzez的博客 5731

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

动态规划、贪婪算法、剪绳子

1.动态规划 使用条件:问题能够分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑使用动态规划来解决这个问题。 特点: 求一个问题的最优解; 整体问题的最优解是依赖各个子问题的最优解; 大问题分解成若干个小问题,这些小问题之间还有相互重叠的更小的子问题; 从上往下分析问题,从下往上求解问题。 1.1 剪绳子 需要O(n2)的时间复杂度和O(n)空间复杂度 public class CuttingSolution { public static int maxProductCut

Zmd_23的博客 344

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

《剑指offer》刷题——【动态规划与贪婪算法】面试题14:剪绳子(java实现)

《剑指offer》刷题——【动态规划与贪婪算法】面试题14:剪绳子一、动态规划1. 应用动态规划求解的问题的特点二、贪婪算法三、题目描述四、解题思路(一)动态规划1. 思路分析2. 代码实现(动态规划)3. 时间复杂度O(n^2)(二)贪婪算法1. 思路分析2. 代码实现3. 时间复杂度O(1) 一、动态规划 1. 应用动态规划求解的问题的特点 求一个问题的最优解(最大值、最小值) 该问题能否分...

HW_870754395的博客 973

动态规划、贪婪算法 - 13.剪绳子

剪绳子是动态规划和贪婪算法是典型问题。 动态规划分析: 我们先来简短的讲解什么是动态规划? 动态规划是将一个大问题分解为小问题,小问题种还有小问题,我们对最小单位的小问题求最优解之后,那么向上推进,大问题也就是最优解了。 动态规划的运用范围: 如果面试题是求一个问题的最优解(通常是求最大值和最小值),而且该问题的能够分成若干个子问题,并且子问题之间还有重叠的更小的子问题,那么就可以考虑使用动态规...

weixin_44916741的博客 268

剑指offer8:剪绳子问题(动态规划和贪婪算法)

内容:给定一根长度为n的绳子,请把绳子剪成m段,每段绳子记为k[0],k[1]……k[m]。请问k[0]*k[1]……*k[m]可能的最大乘积是多少?例如:当绳子长度为8时,我们把它剪成长度分别为2,3,3段,此时最大乘积为18.解题思路:思路一:我们先考虑能否把大问题分解成小问题,分解后的小问题也存在最优解,如果把小问题的最优解组合起来能否是整个问题的最优解,这就是动态规划求解。我们把绳子从第i...

qq_41889292的博客 3129

剪绳子(动态规划)

剪绳子 给你一根长度为n绳子,请把绳子剪成m段(m、n都是整数,n&gt;1并且m&gt;1)。每段的绳子的长度记为k[0]、k[1]、……、k[m]。问k[0] * k[1]*…*k[m]可能的最大乘积是多少?例如当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到最大的乘积18。 有一段长度为n的绳子,剪的第一刀可以在[1,n-1]。 第一刀下去后,绳子分成两部分,假设在i处剪...

mabiao6822的博客 402

C语言:剪绳子

题目:给你一根长度为n的绳子,请把绳子剪成m段(m和n都是整数,n&gt;1并且m&gt;1)每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]*k[1]*...*k[m]可能的最大乘积是多少? **例如:**当绳子的长度为8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。 这道题目时典型的动态规划题,自上而下分析问题、自下而上解决问题。 同时也可以考虑使用贪婪...

weixin_43936250的博客 2051

剑指Offer(Python多种思路实现):剪绳子

剑指Offer(Python多种思路实现):剪绳子 面试14题: 题目:剪绳子 题:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,且n&gt;1,m&gt;1),每段绳子的长度记为k[0],k[1],k[2],...,k[m]。请问k[0]*k[1]*...*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积为18。...

weixin_44151089的博客 1273

剪绳子 算法_动态规划与贪婪算法剪绳子(实现与思路)

下面给大家分享的是动态规划与贪婪算法剪绳子的代码实现与思路,感兴趣的朋友可以一起来了解一下,一共有3种代码实现思路哦。题目:给你一条长度是n的绳子,将绳子剪成整数长的m段(m、n都是整数,n&gt;1并且m&gt;1),每段绳子的长度记做k[0],k[1],...,k[m]。问:k[0]xk[1]x...xk[m]可能的最大乘积是多少?例:在绳子长度是8的时候,我们将它剪成长度分别是2、3、3的三...

weixin_35712571的博客 345

【剑指offer】面试题14:剪绳子——动态规划、剪绳子2——贪婪算法

一、动态规划-剑指 Offer 14- I 剪绳子 1.通过record记录每个f(n)的解 2.由f(n) = max( f(i) * f(n-i) ) 如果从高往低会有重复运算,从低到高可以避免。 3.通过O(n2)进行遍历可以把所有的最大解全部求出来。 class Solution { public: int cuttingRope(int n) { //通过record记录每个f(n)的最大解,即长度为n的绳子剪成若干段后各段长度乘积的最大值 //通过f(n)

Jocelin47的博客 284

剪绳子问题原理(动态规划与贪婪算法)

原题是剑指offer面试题14的剪绳子问题,涉及到动态规划和贪婪算法。原问题侧重于动态规划和贪婪算法的原理及实现,对问题本身的分析不到位,尤其是为什么当时,只要证明就可以证明应该将绳子切割出尽量多的长度为3的绳子。本文用数学公式的形式推导此问题最优解为何时每一小段绳子长度为3时绳子的乘积为3。 问题描述:一段绳子的长度为n,划分为m段(n,m均为整数,n&gt;1且m&gt;1),每段的长度记为k[0],k[1],k[2],…,k[m],请问k[0]×k[1] ×k[2] ×…×k...

YPSXYY的博客 1036

剪绳子python_Python 剪绳子的多种思路实现(动态规划和贪心)

剑指Offer(Python多种思路实现):剪绳子面试14题:题目:剪绳子题:给你一根长度为n的绳子,请把绳子剪成m段(m,n都是整数,且n&gt;1,m&gt;1),每段绳子的长度记为k[0],k[1],k[2],...,k[m]。请问k[0]*k[1]*...*k[m]可能的最大乘积是多少?例如,当绳子的长度为8时,我们把它剪成长度分别为2,3,3的三段,此时得到的最大乘积为18。解题思路一:...

weixin_39707725的博客 241
上一篇: 回朔法之机器人的运动范围
下一篇: 位运算之二进制中1的个数
H_Expect
博客等级 码龄8年 20粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值