题目描述
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[1],...,k[m]。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
输入描述:
输入一个数n,意义见题面。(2 <= n <= 60)
输出描述:
输出答案。
示例1
输入
8
输出
18
思路
动态规划。如果绳子长度为6,则可能分成两大段(1,5),(2,4),(3,3)。由于之前已经保存了绳子长度为1,2,3,4,5时绳子切割的为不同段的最大乘积,所以直接计算绳子切割为不同段后乘积的最大值作为当前长度的绳子切割后最大乘积。
class Solution {
public:
int cutRope(int number) {
if (number <= 1) {
return 0;
}
if (number == 2) {
return 1;
}
if (number == 3) {
return 2;
}
vector<int>result(number + 1);
result[1] = 1;
result[2] = 2;
result[3] = 3;
for (int i = 4; i <=number; i++)
{
int tmp = 0;
for (int j = 0; j <= number / 2; j++)
{
tmp = max(result[j] * result[i - j], tmp);
}
result[i] = tmp;
}
return result[number];
}
};
网友评论