一、剪繩子

一、題目描述

給你一根長度爲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];
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章