题目描述:
思路:
首先,该问题可以转化成:
已经n可以由m个数字k[0], k[1], k[2], k[3]...k[m-1]相加而成,也就是n=k[0]+k[1]+k[2]+...,又很多种可能,但是必须保证n>1, m>1,求得最佳的方案,使得
k[0]*k[1]*k[2]*的乘积最大。并返回这个最大乘积
经过公式推导(具体公式推导在下方),当长度被平均划分为多个3组成的时候,最后得到的乘积结果,最大,但是往往并不是恰好能分为多个3构成,假设能划分为l个3加上最后的一个长度b(b的可能取值为0,1,2)。
然后分别对b的值为0,1,2进行讨论:
1、当b=0的时候,最大的长度就是3l
2、当b=1的时候,最大的长度就是pow(3, l-1)*(2*2)
3、当b=2的时候,最大的长度就是pow(3, l)*2
那么以上的结论怎么推导而来的呢?
具体推导过程在leetcode官网讨论区:公式推导
代码实现:
class Solution {
public:
int cuttingRope(int n) {
if(n<=3){ //为了保证在绳子的长度小于3的时候划分的绳子段数也大于1,于是单独提出来讨论。
if(n==2){
return 1;
}
else{
return 2;
}
}
if(n%3==0){
return pow(3, n/3);
}
else if(n%3==1){
return pow(3, n/3-1)*2*2;
}
else{
return pow(3, n/3)*2;
}
}
};