題目如下:
給你一根長度為 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
當n>=5時,3 ( n − 3 ) > = 2 ( n − 2 ) 且只在n取5時取等號,且它們都大於n ,所以應把繩子剪成盡量多的3
書上言盡於此,我想了下如果剪成其它大小的會不會更好。如果剪成4,那麼4 = 2 × 2 = 2 + 2 就還是和剪成兩個2一樣,如果剪成5,那麼5還能繼續剪剪成3和2,往後也是一樣。試想更大的數,比如15,得到一段15以後不剪是不可能的,因為前面說了這時候3 ( n − 3 ) > 2 ( n − 2 ) > n ,那麼剪成更小的段,只要不小於5就一定滿足這個就要繼續減,如果比5小,從1~4的情況都想過了,4是不用管的或者剪成兩個2,3就保留,2也保留,1不要出現。
當0< number <=3的時候,我們知道最大乘積就是number-1
當number=4,return number * max,4 *1=4;
當number>4時,我們得出規律,盡可能多剪長度為3的繩子,最後的乘積是最大的。
**如下:
#include
intcutrope
(int number)
while
(number >4)
return number * max;
}int
main()
執行截圖如下:![](https://pic.w3help.cc/cf2/845fd1e42eb62db7a033d5cf42b74.jpeg)
首先定義函式f(n)為把長度為n的繩子剪成若干段後各段長度乘積的最大值。在剪第一刀時,我們有n-1種選擇,也就是說第一段繩子的可能長度分別為1,2,3…,n-1。因此f(n)=max(f(i)*f(n-i)),其中0乙個更好的辦法是按照從下而上的順序計算,也就是說我們先得到f(2),f(3),再得到f(4),f(5),直到得到f(n)。當繩子的長度為2的時候,只能剪成長度為1的兩段,所以f(2) = 1,當n = 3時,容易得出f(3) = 2。
**如下:
int
maxproductofcutrope
(int length)
;for
(int i =
4; i <= length;
++i)
} products.
push_back
(max);}
return products[length]
;}
兩種方法解決約瑟夫問題
第一種 構建迴圈鍊錶,然後不斷遍歷鍊錶直到剩下最後乙個元素。include include include include include include using namespace std typedef struct list list,link int main p next head n...
兩種方法解決排列問題
time limit 1.000 sec memory limit 128 mb problem description 有4個互不相同的數字,請按序輸出由其中三個不重複數字組成的排列。input 4個整數。output 所有排列,輸出順序見樣例。sample input 1 2 3 4 out i...
LCA兩種方法
lca least common ancestors 即最近公共祖先,是指在有根樹中,找出某兩個結點u和v最近的公共祖先。模板題 anc i j 表示第i個點的2 j的祖先的標號 整個過程就是兩個點往上跳到同一深度,再一起往上跳找到lca include include using namespac...