題目:給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段(m、n都是整數,n>1並且m>1),每段繩子的長度記為 k[0],k[1]…k[m-1] 。請問 k[0]k[1]…*k[m-1] 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。
分析:有點像數學的題目,第一眼的反應是動態規劃。
開始分析:
n=2: 1+1 -->11=1; dp[2]=1;
n=3: 2+1 -->21=2; dp[3]=2;
n=4: 2+2 -->22=4; dp[4]=4;
n=5: 3+2 -->32=6; dp[5]=6;
貌似看不出規律,別急再多寫幾個
n=6: 3+3 -->33=4; dp[6]=9;
n=7: 4+3 -->43=12;–>dp[4]3=12 dp[7]=12;
n=8: 5+3 -->63=12;–>dp[5]3=18 dp[8]=18;
n=9: 6+3 -->93=12;–>dp[6]3=27 dp[9]=27;
n=10: 7+3 -->123=36;–>dp[7]*3=12 dp[10]=36;
找到遞推的規律:
通過上述分析,規律明顯在n=7以後為
if(n>=7)
dp[n] = dp[n-3]*3;
為什麼會是3這個數字?
轉化為數學問題,用數學公式求導得出的是e ,取整數為3。
class solution
return dp[n];}
}
劍指offer 14 剪繩子
分析 本題可以用動態規劃,也可以用貪心法。動態規劃 設f n 表示當繩子長n時可以得到的最大乘積,那麼假設在i處切一刀,就會得到數學式子f n max f i f n i 02等於4,但是當n大於等於5時,我們就要拆成盡可能多的3和剩下的2。如果要證明,我們可以證明當n大於5時,有3 n 3 2 n...
劍指offer 14 剪繩子
這種文章網上很多,沒什麼營養,我只是自己記錄一下。雖然現在不找工作了,但以後演算法能力肯定需要加強,想著能不能每天堅持一道題,其實真做起來還有點難 劍指offer以前都是邊看答案邊記下來,現在能不能靠自己寫出來呢。時間複雜度為o n2 空間複雜度為o n 有一點要注意,m不是乙個給定的引數。思路是,...
劍指Offer 14 剪繩子
nowcode 把一根繩子剪成多段,並且使得每段的長度乘積最大。n 2 return 1 2 1 1 n 10 return 36 10 3 3 4 盡可能多剪長度為 3 的繩子,並且不允許有長度為 1 的繩子出現。如果出現了,就從已經切好長度為 3 的繩子中拿出一段與長度為 1 的繩子重新組合,把...