offer 14-I 减绳子

别有洞天
• 阅读 1171

减绳子

offer 14-I 减绳子
看到题目首先觉得是递归算法-动态规划 Dynamic Programming--从菜鸟到老鸟

题目分析

本题目就是分析k0k1……*km的最大值
根据数学公式
offer 14-I 减绳子
简单来说就是需要比较axb和((a+b)/2) x ((a+b)/2)的大小,a*b的最大值就是((a+b)/2) x ((a+b)/2),当且仅当a=b时成立,所以原题目就是当里面的n1 n2 na全部相等式等号成立,也就是均分
按照题目通过计算找到极值点发现是e,但是题目要求必须为整数,也就是2或者3,然后通过计算发现整数取3的时候可以得到最大值,乘积最大。
offer 14-I 减绳子

切分规则 找规律

  • 把绳子尽可能的切成多个长度时3的,最后留下的最后一段绳子应该长度时0 1 2
  • 如果最后一段的绳子长度是2,就不剪了,因为2>1*1
  • 如果最后一段的绳子长度是1,就应该把倒数第二段的3合起来,变成4然后拆成2+2,因为22>13,此时前面都是全部是3的绳子段子,只是最后两段变了
  • offer 14-I 减绳子

题解

offer 14-I 减绳子

牛批写法:和三为一:return n <= 3? n - 1 : pow(3, n / 3) * 4 / (4 - n % 3);

这个合三为1真的是很强了
offer 14-I 减绳子
这个是以4为临界点,因为4除3余1,所以遇到最后分割剩下4就跳出循环然后直接×剩下的4,如果不是4,是5,那就剩下2,继续运算就好了

递归算法 没找到规律的话

  • 基本思路:采用动态规划方法。定义dp状态result[i]为绳长为i时,绳子的可能最大长度乘积。下面我们探究递推关系,对于绳长为i的绳子,我们选择在j位置将绳子剪断,此时绳子被分成长度为j和长度为i - j的两部分,此时剪断之后绳子可能的最大长度乘积,为绳长为j和绳长i - j时候结果的积。而dp状态更新为max(result[i],result[j] × result[i - j])。
  • 其实就是定义绳子得到的最大乘积状态:dp状态result[i]为绳长为i时,绳子的可能最大长度乘积
  • 然后将i此时得到的最大乘积值存到数组里,然后将i继续裁剪又可以将i的绳子分为j和i-j,那么此时绳子的最大乘积为j*(i-j),也就是此时dp状态result[i]的最大乘积应该是max(result[i],result[j] × result[i - j]),万一剪开之后乘积不如原来的大呢,所以就得利用max找到最大的
  • dp数组的长度:由于定义result[i]为绳长度为i时的结果,因此result[n]为最后一项,所以数组的总长度为n + 1
  • j的遍历范围:如果j > i/2,那么result[j]已经由之前的result[i - j]遍历过,导致重复计算,因此j最多遍历到i/2。同时,由于题目规定必须要切一刀,因此不能使得某一段的长度为0,因此j最少遍历到1。
  • 当作为结果返回时,必须要切一段,不能不切。但是如果不是递归调用就可以不用切

offer 14-I 减绳子
offer 14-I 减绳子

点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
梦
5年前
微信小程序new Date()转换时间异常问题
微信小程序苹果手机页面上显示时间异常,安卓机正常问题image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/b691e1230e2f15efbd81fe11ef734d4f.png)错误代码vardate'2021030617:00:00'vardateT
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Stella981 Stella981
4年前
Linux有关Shell算数运算的用法补充笔记
!(https://oscimg.oschina.net/oscnet/530f6f5c295b4085a5d29c71d1a5c10a.png)1、自增自减Shell的自增自减和其他编程语言的语法基本上是一样的。主要包括四种:前置自增、前置自减、后置自增、后置自减。前置的原理是先修改变量的值,然后将变量的值传递出去。后置
Wesley13 Wesley13
4年前
ACM金牌大神侯卫东老师的四步动规解题秘籍!请收下
近年来,国内外科技公司的算法面试中,动态规划几乎成了必考题型。动规题目类型众多,又没有固定的解题模板,初学者往往摸不着头脑,有时还会混淆动规和递归,所以动态规划又被称为“新人杀手”。不过动态规划的难,更多是因为初学者不知道怎么入门。学会正确的思考模式和解题流程,掌握动态规划其实并不难。九章侯卫东老师针对所有动态规划题型,总结了一套
CRM从哪些方面进行了管理?
我们将CRM(https://www.sap.cn/products/crm.html!image(https://imghelloworld.osscnbeijing.aliyuncs.com/imgs/17e2d96568a98f0
贾蔷 贾蔷
9个月前
力扣1137题 解题思路和步骤 C++代码实现,力扣一共多少题
一、题目分析力扣1137题要求我们找到第N个泰波那契数。泰波那契数的定义是:T00,T11,T21,且在n0的条件下Tn3TnTn1Tn2。,当n4时,T4T3T2T14。这道题主要考查我们对递归或动态规划的理解和运用。在思考解题方法时,我们