思路:遞歸式爲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語言翻譯過來的,我好像只能作知識的搬運工...