*題目:給你一根長度為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。首先是貪婪演算法 ...