劍指Offer(八) 動態規劃

2021-10-21 08:34:02 字數 1437 閱讀 5774

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

我們先定義函式f(n)為把繩子剪成若干段之後的各段長度乘積的最大值。在剪第一刀的時候,我們會有n-1種可能的選擇,也就是說剪出來的第一段繩子的長度可能為1,2,......n-1。

因此就有了遞迴公式 f(n) = max(f(i)*f(n-i)),其中0遞迴會產生大量不必要的重複計算,所以可以考慮採用動態規劃的方法

盡量把大於5的數分解成3的乘積,如果剩下的長度為4,則把4分解成2和2,因為3x1 < 2x2。

#貪婪演算法

class solution:

def cutrope(self, number):

# write code here

if number < 2:

return 0

if number == 2:

return 1

if number == 3:

return 2

#申請輔助空間

timesof3 = number / 3

if (number - timesof3*3) == 1:

timesof3 -= 1

timesof2 = (number - timesof3*3) / 2

return pow(3, timesof3)*pow(2, timesof2)

從下而上的計算,即先求的f(2),f(3),再計算得到f(4),f(5),以此往後,直到f(n)

#遞迴寫法

class solution:

def cutrope(self, number):

# write code here

if number < 2:

return 0

if number == 2:

return 1

if number == 3:

return 2

products = [0]*(number+1)

products[0] = 0

products[1] = 1

products[2] = 2

products[3] = 3

#動態規劃

for i in range(4,number+1):

max_ = 0

for j in range(1, i/2+1):

max_ = max(products[j]*products[i-j], max_)

products[i] = max_

return products[number]

劍指offer 動態規劃

動態規劃 10 1.py 寫乙個函式,輸入 n 求斐波那契 fibonacci 數列的第 n 項。斐波那契數列的定義如下 class solution def fib self,n int int if n 0 return 0if n 1 return 1 dp 0 n 1 dp 0 0dp 1 ...

golang實現劍指offer 動態規劃題型

leetcode 面試題49 醜數 題目描述 我們把只包含因子 2 3 和 5 的數稱作醜數 ugly number 求按從小到大的順序的第 n 個醜數。示例 輸出 12 解釋 1,2,3,4,5,6,8,9,10,12 是前 10 個醜數。核心思想 解題思路 func nthuglynumber ...

劍指 offer 貪心 動態規劃篇

10 i.斐波拉契數列 題意 面試題10 i.斐波那契數列 思路 最基礎的動態規劃題。資料量比較大的時候不能使用遞迴,會報stackoverflow exception,最優的方式是迭代計算。class solution int a 0 int b 1 int index 2 int tmp whi...