/* 题目: 给定一个长度为n的绳子,把绳子剪为m段,(n>1,m>1) 求各段绳子乘积的最大值。 */ /* 思路: 动态规划。 f(n)=max(f(1)*f(n-1),f(2)*f(n-2),f(3)*f(n-3),...,f(n/2)*f(n-n/2))。 求最优解。 大问题可分解为若干个小问题。 大问题的解依赖小问题的解。 自顶向下分析问题,自底向上求解问题。 */ #include<iostream> #include<string.h> #include<algorithm> using namespace std; int cutRope(int number){ if(number <= 1){ throw("invalid parameter"); } if(number == 2 || number == 3){ return number-1; } int* maxProduct = new int[number+1]; memset(maxProduct,0,number+1); maxProduct[1] = 1; maxProduct[2] = 2; maxProduct[3] = 3; int max = 0; for(int len = 4; len <= number; len++){ max = 0; for(int left = 1; left <= len / 2; left++){ cout<<len<<" "<<left<<" "<<len-left<<endl; int product = maxProduct[left] * maxProduct[len-left]; if(max < product){ max = product; } } maxProduct[len] = max; //cout<<maxProduct[len]<<endl; } max = maxProduct[number]; delete[] maxProduct; return max; } int main(){ cout<<cutRope(8)<<endl; }