劍指offer——剪繩子(動態規劃)
阿新 • • 發佈:2020-12-24
技術標籤:C++
劍指offer——剪繩子(動態規劃)
題目描述:
給你一根長度為n的繩子,請把繩子剪成整數長的m段(m、n都是整數,n>1並且m>1,m<=n),每段繩子的長度記為k[1],…,k[m]。請問k[1]x…xk[m]可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。
解題:
當繩子的長度小於三的時候,我們可以自己判斷出來當時得到的最大乘積。
number== 2 res = 1;
number==3 res =2;
當number大於等於4 的時候我們就可以用動態規劃來計算,
最大乘積,可以是用j*res[i-j],(將這個可以看成i-j和j兩段,i-j的內部構成,不用去考慮)將所有的可取的j的範圍全部計算一遍,即可知道最大值是多少。
這兩個地方的具體含義是不同的,所以值是不一樣的,下面的是得到的結果,上面部分的程式碼,是一個過程,就是當將這個number不斷細分的時候可以用到的乘積,當只有1長的時候,就是1,類推。
程式碼:
class Solution {
public:
int cutRope(int number) {
if(number<=3)return number-1;
vector<int> res(number + 1, -1);
for(int i = 1;i<=5;i++)
{
res[ i] = i;
}
for(int i =5;i<=number;i++)
{
for(int j = 1;j<i;j++)
{
res[i] = max(res[i],j*res[i-j]);
}
}
return res[number];
}
};