Javaweb第六天學習
阿新 • • 發佈:2022-02-12
劍指 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]
可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到的最大乘積是18。
示例 1:
輸入: 2 輸出: 1 解釋: 2 = 1 + 1, 1 × 1 = 1
示例 2:
輸入: 10 輸出: 36 解釋: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36
沒做出來。。。看答案看懂了,首先要證明分割的長度是多少是最優的,經過數學計算,每段分割3是最優的,看到的大神dp的做法,太牛了
class Solution { public: int cuttingRope(int n) { if (n <= 3) return n - 1; vector<int> dp(n + 1, 0); dp[0] = 0; dp[1] = 1; dp[2] = 2; dp[3] = 3; for (int i = 4; i <= n; i++) { for (int j = 1; j <= i / 2; j++) { dp[i] = max(dp[i], dp[j] * dp[i - j]); } } return dp[n]; } };