1.题目描述
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]...k[m-1] 。请问 k[0]*k[1]*...*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
提示
2 <= n <= 58
方法:数学分析法
算法思想
1.设将长度为 n的绳子切为 a 段:n=n1+n2+n3....na,本题就等价于求n1*n2*n3.....na的最大值
2.
3.因为本题已经提示n>2;所以只需要判断n=2和n=3的特殊情况
4.当n>4,将这段绳子切割成每段都是3的时候,存在3种情况
a)最后剩余的绳子长度为0;
b)最后剩余的绳子长度为1;
c)最后剩余的绳子长度为2;
5.绳子剩余1的时候比较特殊,因为长度为4的绳子分成2*3比分成1*3的乘积要大,我们可以直接把这种特殊情况提出来,当n变化到小于等于4时,就直接令之前的累乘结果乘n就可以
代码
class Solution {
public:
int cuttingRope(int n) {
if (n==2)
return 1;
if (n==3)
return 2;
int sum=1;
while (n>4){
sum*=3;
n-=3;
}
return sum*n;
}
};