參考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.我們有兩種不同的方法解決這...