一、題目描述
給你一根長度爲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];
}
};