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

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]可能的最大乘积是多少? 阅读详情

相关推荐

三种 绘制奈奎斯特曲线 的方法

如何绘制Nyquist曲线 提供三种绘制方法,其中使用最广泛的是概略图绘制方法 ①解析法绘制 ②概略图法绘制 ③MATLAB绘制

weixin_46664967的博客 6万+

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

一、前言 《剑指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

ULN2003驱动28BYJ-48步进电机详解(附:51 32代码讲解)

本文介绍了28BYJ-48步进电机的驱动原理以及注意事项,并展示了极简 32 51驱动代码

qq_41818650的博客 1万+

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

题目:给你一根长度为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

国外无人机蜂群作战典型战例及发展趋势

参与袭击的无人机为简易组装的固定翼飞机,采用小排量活塞发动机和手机GPS通信模块零件,机翼为轻木加泡沫板混合结构,尾梁为铝合金方管,主要依靠胶带粘接,以上全部配件均可在商用市场买到,成本较低,可在短时间内装配完成。③战场纵深短、瞬时性强。蜂群作战的参战数量显著增加,这一方面得益于无人机技术的飞速发展使得廉价无人机可以大量生产和仿制,另一方面凭借迅速发展的投放和回收技术以及集群控制技术,使得无人机蜂群可在极短时间内实现编队饱和攻击,在快速消耗敌方高价值防空武器系统的同时,保证己方物资系统的突防概率。

renhongxia1的博客 2480

说说PSTN、ISDN、 ADSL三种互联网接入方式的区别。

互联网的接入方式: 电话拨号接入(PSTN) ISDN接入 ADSL接入 Cable MODEM接入 局域网接入 光纤接入(FDDI) 卫星接入 DDN专线 目前来说,ADSL和Cable MODEM比较常用,今天我们就先来说说PSTN、ISDN和ADSL的区别。 电话拨号接入(PSTN/POTS,Public Switched Telephone Network / Public Oold Telephone Service) 数据终端设备(DTE)通过数据通信设备(DCE)再连

Winyaz的博客 2万+

动态规划-剪绳子问题

题目 给你一根长度为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

航空大数据——项目资源汇总及开源(四)

ADS-B项目开源大礼包

cyc头发还挺多的博客 4983

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

题目描述 给你一根长度为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

【100%通过率】华为机试真题 Python 实现【对称美学】【2022.11 Q4 新题】

对称就是最大的美学,现有一道关于对称字符串的美学。 已知: 第1个字符串:R 第2个字符串:BR 第3个字符串:RBBR 第4个字符串:BRRBRBBR 第5个字符串:RBBRBRRBBRRBRBBR相信你已经发现规律了,没错! 就是第i个字符串=第i-1号字符串的取反+第i-1号字符串。取反即(R->B,B->R); 现在告诉你n和k,让你求得第n个字符串的第k个字符是多少。(k的编号从0开始)

MISAYAONE的博客 1万+

PCL 从LAS文件中获取点云的颜色【2026最新版】

PCL从LAS文件中获取点云的RGB信息(pcl::PointXYZRGB)并进行可视化。博客长期更新,本文最新更新时间为:2026年5月4日。

点云侠的博客 1720

剪绳子问题(贪心算法)

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

qq_41613496的博客 3415

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析(零件转产品)

CATIA二次开发核心技术:多实体零件自动化拆解与装配生成深度解析

KE17RS的博客 2145

《剑指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

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

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

Zmd_23的博客 345

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

HW_870754395的博客 973

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

动态规划、贪婪算法 - 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、付费专栏及课程。

余额充值