给你一根长度为 n 的绳子,请把绳子剪成整数长的 m 段( m 、 n 都是整数, n > 1 并且 m > 1 , m <= n ),每段绳子的长度记为 k[1],...,k[m] 。请问 k[1]*k[2]*...*k[m] 可能的最大乘积是多少?例如,当绳子的长度是 8 时,我们把它剪成长度分别为 2、3、3 的三段,此时得到的最大乘积是 18 。数据范围: 2 \le n \le 602≤n≤60
进阶:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)
方法一:暴力递归(时间复杂度太高,不能AC,相当于枚举所有情况,挺暴力的
class Solution {
public:
int digui(int n){
if(n <= 4){
return n;
}
int ret = 0;
for(int i =1;i<n;i++){
ret = max(ret,i * digui(n-i));
}
return ret;
}
int cutRope(int number) {
if(number == 2){
return 1;
}
if(number ==3){
return 2;
}
int ret = digui(number);
return ret;
}
};
方法二:动态规划
class Solution {
public:
int cutRope(int number) {
if(number == 2){
return 1;
}
if(number == 3){
return 2;
}
vector<int> dp(number+1,-1);
dp[1] = 1;
for(int i=2;i<=number;i++){
for(int j = 1;j<i;j++){
dp[i] = max(dp[i],(max(j,dp[j])) * (max(i-j,dp[i-j])));
}
}
return dp[number];
}
};