[劍指offer]14-1.剪繩子

14-1.剪繩子

方法一 動態規劃

思路:遞歸式爲f(n)=max(f(i), f(n-i)),i=1,2,...,n-1python

雖然我如今也沒有完全明白這個遞歸式是怎麼來的,但用的時候仍是要注意一下。f(i)是指長度爲i時的最大乘積。算法

可是,上面關於f(i)的定義,當i=1,2,3時是不成立的。翻譯

由於,長度爲1時,只能返回0;長度爲2時,只能返回1,;長度爲3時,只能返回2。可是爲了方便之後的計算,強行規定f(1)=1,f(2)=2,f(3)=3.code

代碼遞歸

class Solution:
    def cuttingRope(self, n: int) -> int:
        if n < 2:
            return 0
        if n == 2:
            return 1
        if n == 3:
            return 2
        dp = [0 for _ in range(n+1)]
        dp[0] = 0
        dp[1] = 1
        dp[2] = 2
        dp[3] = 3
        for i in range(4, n+1):
            max = 0
            for j in range(1, i//2+1):
                dP = dp[j]*dp[i-j]
                if max < dP:
                    max = dP
            dp[i] = max
        return dp[n]

結果內存

執行用時 :44 ms, 在全部 Python3 提交中擊敗了54.30%的用戶
內存消耗 :13.5 MB, 在全部 Python3 提交中擊敗了100.00%的用戶數學

方法二 貪心算法

思路:儘可能取3,而後取2.io

具體操做以下:對於長度=n的繩子,先取n//3(向下取整)段長度=3m的繩子。若是此時繩子長度僅剩1m,則只取(n//3-1)段3m的繩子(保證剩下的繩長爲偶數)。class

對於剩下的偶數繩長,將它切成2m一段的繩子便可。原理

最後的乘積爲(3(timesOf3))*(2(timesOf2)).

代碼

class Solution:
    def cuttingRope(self, n: int) -> int:
        if n < 2:
            return 0
        if n == 2:
            return 1
        if n == 3:
            return 2
        timesOf3 = n // 3
        if n - timesOf3*3 == 1:
            timesOf3 -= 1
        timesOf2 = (n - timesOf3*3)//2
        return pow(3, timesOf3)*pow(2, timesOf2)

結果

執行用時 :52 ms, 在全部 Python3 提交中擊敗了30.30%的用戶
內存消耗 :13.5 MB, 在全部 Python3 提交中擊敗了100.00%的用戶

寫在最後

這道題能夠用遞歸作。可是因爲f(1),f(2),f(3)不是當繩子長度爲1,2,3時的最大乘積,因此我尚未想到怎麼去作。

另外,不管動態規劃仍是貪心算法,數學原理我仍然蒙圈。這個代碼是從劍指offer的C語言翻譯過來的,我好像只能作知識的搬運工...

相關文章
相關標籤/搜索