190 剪繩子問題 兩種方法

2021-10-20 01:25:50 字數 1609 閱讀 1750

題目如下:

給你一根長度為 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()

執行截圖如下:

首先定義函式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...