14.剪繩子

題目描述

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

輸入輸出

輸入8,輸出則爲18

思路1:動態規劃思想。什麼樣的題可以用動態規劃思想求解:1.題目是最優化問題 2.最優化問題可以分解成很多小的最優化子問題  3.分解的子問題有重疊部分。把一條長爲n的繩子剪成2段,使得長度的乘積最大,從長度爲i的地方剪,那麼得到的乘積是i*(n-i)。但不知道從哪裏開始,那麼就試唄,從i=1,i=2,i=3,...,i=n-1的地方剪,長度最大的乘積是max(i*(n-i))。但是現在不是讓剪兩段,現在是要剪成m段,這m段長度的乘積是最大的。...........

python題解:

# -*- coding:utf-8 -*-
class Solution:
    def cutRope(self, number):
        # write code here
        if number<2:
            return 0
        if number==2:
            return 1
        if number==3:
            return 2
        
        f=[0]*(number+1)  ##f={}也可以
        f[0]=0
        f[1]=1
        f[2]=2
        f[3]=3
        
        for num in range(4,number+1):
            tmp_max=0
            for i in range(1,number/2+1):
                if f[i]*f[num-i]>tmp_max:
                    tmp_max=f[i]*f[num-i]
            f[num]=tmp_max
        final_max=f[number]
        return final_max
            

這道題也可以變形呀,可以問乘積最大時,繩子被剪成了幾段?

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