给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],…,k[m]。请问k[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
示例1
输入
8
输出
18
题解思路
找出最优解的规律
当n等于1,2,3的时候,结果是固定的
当n大于3的时候,可以看以下数据
n=4, 最优解:2 2
n=5, 最优解:3 2
n=6, 最优解:3 3
n=7, 最优解:3 2 2
n=8, 最优解:3 3 2
n=9, 最优解:3 3 3
n=10,最优解:3 3 2 2
n=11,最优解:3 3 3 2
n=12,最优解:3 3 3 3
n=13,最优解:3 3 3 2 2
n=14,最优解:3 3 3 3 2
n=15,最优解:3 3 3 3 3
…
发现规律
- 当n % 3 == 0 时,有n / 3个数字,没有2 ;
- 当n % 3 == 1 时,有n / 3 + 1个数字,其中有2个2;
- 当n % 3 == 2 时,有n / 3 + 1个数字,其中有1个2;
知道规律后代码如下:
public:
int cutRope(int n) {
if(n <= 1){
return 0;
}
if(n == 2){
return 1;
}
if(n == 3){
return 2;
}
//计算有多少个数字
int length = n % 3 == 0 ? n / 3 : n / 3 + 1;
//计算其中有多少个2
int length1 = n % 3 == 0 ? 0 : 3 - n % 3;
//结果
int result = 1;
for(int i = 0; i < length1; i++){
result = result * 2;
}
for(int i = 0; i < length - length1; i++){
result = result * 3;
}
return result;
}
};