JZ 14 I 剪繩子(數學 動態規劃)

2021-10-21 04:25:27 字數 1860 閱讀 7062

參考1

參考2用乙個陣列 dp 記錄從 0 到 n 長度的繩子剪掉後的最大乘積,即 dp[

i]dp[i]

dp[i

] 表示長度為 i 的繩子剪成 m 段後的最大乘積,初始化 dp[

2]=1

dp[2] = 1

dp[2]=

1,最終返回dp[

n]dp[n]

dp[n

](陣列大小需要設為n+1

n+1n+

1)。假設已經減掉了長度為 j 的第一段,為了使得最後的乘積最大,從長度為2開始剪,即第一段長度 j 的取值範圍為[2,

i)[2,i)

[2,i

)。剩下的 ( i - j )長度的繩子可以剪也可以不剪,不剪的話長度乘積為 j∗(

i−j)

j*(i-j)

j∗(i−j

);剪的話長度乘積為 j∗d

p[i−

j]j*dp[i-j]

j∗dp[i

−j]。為了使得長度乘積最大,我們取兩者中的最大值。

故d p[

i]dp[i]

dp[i

]的轉移方程為:dp[

i]=m

ax(d

p[i]

,max

(j∗(

i−j)

,j∗d

p[i−

j]))

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

dp[i]=

max(

dp[i

],ma

x(j∗

(i−j

),j∗

dp[i

−j])

)

class

solution

}return dp[n];}

}

notes:

這裡的轉移方程裡還考慮了 dp[

i]dp[i]

dp[i

] ,是因為j

jj的取值是不確定的,不同的j

jj會有不同的結果。

由算數-幾何平均值不等式可知,剪成相等長度的m段時乘積最大。

接下來考慮相等的每一段的長度為多少時乘積最大。設該長度為 x

xx,分為a

aa段,n=a

xn=ax

n=ax

,則乘積為xa=

xnx=

(x1x

)nx^a=x^\frac=(x^\frac)^n

xa=xxn

​=(x

x1​)

n,其中n

nn為常數,那麼要求x

ax^a

xa的最大值,也就是求y=x

1xy=x^\frac

y=xx1​

的最大值。

兩邊取對數、對x求導後可得駐點x0=

e≈2.7x0

​=e≈

2.7,且dyd

x\begin>0,\quad x \in[-\infty,e)\\<0, \quad x \in(e,\infty]\end

dxdy

​\times4

3a−1×4

;b = 2時,返回3a×

23^a\times2

3a×2

class

solution

}

劍指 Offer 14 I 剪繩子(動態規劃)

難度 中等 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 1 請問 k 0 k 1 k m 1 k 0 k 1 k m 1 k 0 k 1 k m 1 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它...

動態規劃 剪繩子

include include include using namespace std 題目 給你一根長度為n的繩子,請把繩子剪成m段 m和n都是整數,n 1並且m 1 每段繩子的長度記為k 0 k 1 k m 請問k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度為8時,我們把它剪成...

剪繩子動態規劃

題目 給你一根長度為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.我們有兩種不同的方法解決這...