1. 程式人生 > 實用技巧 >67、剪繩子

67、剪繩子

給你一根長度為n的繩子,請把繩子剪成整數長的m段(m、n都是整數,n>1並且m>1,m<=n),每段繩子的長度記為k[1],...,k[m]。請問k[1]x...xk[m]可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。

定義一個數組dp,其中dp[i]表示的是長度為i的繩子能得到的最大乘積。我們先把長度為i的繩子拆成兩部分,一部分是j,另一部分是i-j,那麼會有下面4種情況
1,j和i-j都不能再拆了

dp[i]=j*(i-j);
2,j能拆,i-j不能拆

dp[i]=dp[j]*(i-j);
3,j不能拆,i-j能拆

dp[i]=j*dp[i-j];
4,j和i-j都能拆

dp[i]=dp[j]*dp[i-j];
我們取上面4種情況的最大值即可。我們把它整理一下,得到遞推公式如下

dp[i] = max(dp[i], (max(j, dp[j])) * (max(i - j, dp[i - j])));

# -*- coding:utf-8 -*-
class Solution:
    def cutRope(self, number):
        # write code here
        if number == 2:
            return 1
        dp 
= [0 for i in range(number+1)] dp[2] = 2 for i in range(3, number+1): for j in range(2, i): dp[i] = max(dp[i], dp[j]*(i-j), j*(i-j)) return dp[-1]