一、题目描述
给你一根长度为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.首先明确这是动态规划问题
2.假设f(n)为长度为n的绳子的最大乘积,绳子被砍成两段,第一段长度为i,第二段为n-i,那么有f(n)=max(f(i)*f(n-i)),(f(i),f(n-i)表示长度为i或n-i的绳子的最大乘积,相当于把两段绳子继续剪,还是一样的思路求解),直到绳子剪到长度为1,2,3时候,f(1)=1,f(2)=1,f(3)=2
三、代码实现
class Solution {
public:
int cutRope(int number) {
int array1[number+1];//对应上面的f(n)
array1[1]=1;
array1[2]=2;//注意这里的2,3,在2,3时不剪的长度比剪长度长,所以使用不剪的长度
array1[3]=3;
for(int i=4;i<=number;i++){
int max=0;
for(int j=1;j<i;j++){
int a=array1[j]*array1[i-j];
if(max<a)
max=a;
}
array1[i]=max;
}
return array1[number];
}
};