剪绳子问题
剪绳子问题
问题概述
给你一根长度为 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。
问题分析
数学推论
推论一: 将绳子 以相等的长度等分为多段 ,得到的乘积最大
推论二: 尽可能将绳子以长度 3 等分为多段时,乘积最大。
切分规则
最优:3。把绳子尽可能切为多个长度为 3的片段,留下的最后一段绳子的长度可能为 0,1,2三种情况。
次优:2 。若最后一段绳子长度为 2;则保留,不再拆为 1+1。
最差:1 。若最后一段绳子长度为 1;则应把一份 3+1 替换为 2+2,因为 2×2>3×1。
算法步骤
当 n≤3时,按照规则应不切分,但由于题目要求必须剪成 m段,因此必须剪出一段长度为 1的绳子,即返回 n−1 。
当 n>3时,求 n除以 3的 整数部分 a和 余数部分 b。即 n=3^a+b,并分为以下三种情况:
当 b=0时,直接返回 ;
当 b=1时,要将一个 1+3转换为 2+2,因此返回 ×4;
当 b=2时,返回$ 3^a$×2。
代码实现
Java
1 | public class Cut_Rope { |
c++
1 | class Solution { |
大数取模
答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
1 | //基于贪心的思路 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 淋竹调!
评论