1. 程式人生 > 其它 >劍指offer——剪繩子(動態規劃)

劍指offer——剪繩子(動態規劃)

技術標籤: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]; } };