题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述
输入一个数n,意义见题面。(2 <= n <= 60)
输出描述
输出答案。
示例1
输入
8
输出
18
解题思路
- 动态规划思想
- m>1,最少剪一刀
- 定义长度为n的绳子剪切后最大的乘积为f(n),则剪一刀后:f(n)=max(f(i)*f(n-i));
- 由于子问题之间具有重叠性,所有先计算子问题,存储每个子问题的结果,从下至上求得问题的最优解。
- 使用数组保存已经获得的子问题的最优解。
代码实现
function cutRope(number)
{
if(number<2 || number>60){
return 0;
}
if(number==2){
return 1;
}
if(number==3){
return 2;
}
let arr=new Array(number+1);
arr[0]=0;
arr[1]=1;
arr[2]=2;
arr[3]=3;
for(let i=4;i<=number;i++){
let max=0;
//由于arr[1]*arr[3]与arr[3]*arr[1]一样,所以j<=i/2;
for(let j=1;j<=i/2;j++){
let mul=arr[j]*arr[i-j];
if(mul>max){
max=mul;
}
}
arr[i]=max;
}
return arr[number];
}