面试题14:剪绳子、
给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1],…,k[m]。请问k[0]xk[1]x…xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。
思路1:动态规划
class Solution {
public:
int cutRope(int number) {
if(number < 2)
return 0;
if(number == 2)
return 1;
if(number == 3)
return 2;
vector<int> dp(number+1, 0);
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
dp[3] = 3;
for(int i=4; i<=number; i++){
int maxValue = 0;
for(int j=1; j<=i/2; j++){
int temp = dp[j] * dp[i-j];
dp[i] = max(maxValue, temp);
}
}
return dp[number];
}
};
思路2:贪心
class Solution {
public:
int cutRope(int number) {
if(number < 2)
return 0;
if(number == 2)
return 1;
if(number == 3)
return 2;
//尽可能剪去长度为3的绳子段
int timeOf3 = number/3;
//当绳子剩下最后长度为4时,不能剪去3,而应该减去2*2
if(number - 3*timeOf3 == 1)
--timeOf3;
int timeOf2 = (number - 3*timeOf3)/2;
return (int)(pow(3, timeOf3) * pow(2, timeOf2));
}
};