剪绳子
给你一根长度为 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:
输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1
示例 2:
输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
提示:
2 <= n <= 58
1.数学推导
我们都知道一个 “算术几何均值不等式”
当 a=b的时候,取相等,也就是ab的最大值了。
该推广的公式
- 推论 将绳子 以相等的长度等分为多段 ,得到的乘积最大。
假设分为 段,每段长为 ,则有 , 得到的最大积
求函数
但是n是一个常数,转而求下面的最大值
补充一点,求一个已知函数的最大值,就是求导数,然后根据一阶导数为0的点就是驻点,如果驻点左右异的话,这个驻点就可能是极值点,极值点又可能是最值点。
先求驻点,就要先求导。但是求导基本公式里面是没有 这个形式的求导的
再代入
取
取e左右极限,判断
e左边递增加,e的右边减少,可以看出这个是个极大值点,我们前面证明了只有一个驻点,也就最多只有一个极值点,也就最多只有一个极大值点,最大值就是在所有的极大值点选。恰好只有一个,那么最大值点就是
如果这是个数学问题,那么就是e了,交卷。但是这是个实际意义的题,x的取值是整数。所有在e的附件取值,代入函数
证明完毕,取3最优。
- 优先取3
- 剩下 2 ,就用2
- 剩下 1 ,拿回来一个 3 因为 $31<22$
1 | class Solution { |
执行用时 :0 ms, 在所有 Java 提交中击败了100.00% 的用户
内存消耗 :36.2 MB, 在所有 Java 提交中击败了100.00%的用户