學習筆記12 剪繩子

2021-09-14 08:14:40 字數 1227 閱讀 5566

*題目:給你一根長度為n繩子,請把繩子剪成m段(m、n都是整數,n>1並且m≥1)。每段的繩子的長度記為k[0]、k[1]、……、k[m]。k[0]k[1]…k[m]可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2、3、3的三段,此時得到最大的乘積18。

思路:可以用動態規劃和貪婪演算法解決此類尋找最優解的問題。

動態規劃:時間複雜度o(nn),空間複雜度o(n)。

要從上往下分析問題,從下往上解決問題,f(n)=max(f(i)f(n-i))。從n=4開始,內部最優解取的是當繩子為n時候的最優解,而不是n了,products儲存的就是內部最優解。因此動態規劃要從n=4開始,而內部最優解的初始化要初始化到3才行。

貪婪演算法:時間複雜度o(1),空間複雜度o(1)。

當n>=5時,因為3(n-3)>=2(n-2),我們盡可能多的剪長度為3的繩子;當剩下的繩子長度為4時,22>13,把繩子剪成兩段長度為2的繩子乘積最大。

完整**如下:

#include #include // ********************動態規劃********************

int maxproductaftercutting_solution1(int length)

} max = products[length];

delete products;

return max;

}// ********************貪婪演算法********************

int maxproductaftercutting_solution2(int length)

// ********************測試**********************

void test(const char* testname, int length, int expected)

void test1()

void test2()

void test3()

void test4()

void test5()

void test6()

void test7()

void test8()

void test9()

void test10()

void test11()

int main(int agrc, char* ar**)

剪繩子 演算法 C 學習之路之剪繩子問題

基於c 實現剪繩子問題,既將一根長度為n的繩子,剪成m段,使m段的乘積最大。如,長度為10的繩子,最大乘積為36。使用動態規劃和貪心演算法實現,具體 如下 include stdio.h include stdlib.h include using namespace std 動態規劃問題 剪繩子問...

劍指Offer 剪繩子 和剪繩子

劍指offer 剪繩子 題目描述 給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的...

剪繩子問題

給你一根長度為 n 的繩子,請把繩子剪成整數長度的 m 段 m n都是整數,n 1並且m 1 每段繩子的長度記為 k 0 k 1 k m 請問 k 0 k 1 k m 可能的最大乘積是多少?例如,當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到的最大乘積是18。首先是貪婪演算法 ...