数学方法
class Solution {
public:
int maxProductAfterCutting(int n) {
//特判一下n≤3的情况
if(n<=3) return 1*(n-1);
int res=1;
if(n%3==1) n-=4,res*=4;//拆出4
else if(n%3==2) n-=2,res*=2;//拆出2
//此时n一定能被3整除
while(n) res*=3,n-=3;//注意这里是n-=3
//如果是n/=3,可能会多乘一次
return res;
}
};
dp1
class Solution {
public:
int f[60];//f[i]表示长度为i的绳子,能拆出的最大乘积
int maxProductAfterCutting(int n) {
if(n<=3) return n-1;//特判长度123
//长度为123的绳子,能拆出的最大乘积是不拆,不满足递推公式,所以手动赋值
f[1]=1;
f[2]=2;
f[3]=3;
for (int i = 4; i <= n; i ++ )
for (int j = 1; j < i; j ++ )
f[i]=max(f[i],j*f[i-j]);
return f[n];
}
};
dp2
- 内层循环枚举第一刀切出来的长度j,范围1~i-1
- 切完一刀之后,剩下长度为i-j的绳子可切可不切,两种情况都试一下取max即可
- 该算法也可以特判出长度为123的情况,长度为123时,就是不如不切
class Solution {
public:
int f[60];//f[i]表示长度为i的绳子,能拆出的最大乘积
int maxProductAfterCutting(int n) {
for (int i = 2; i <= n; i ++ )
for (int j = 1; j < i; j ++ )//枚举第一刀切出来的长度
f[i]=max(f[i],max(j*(i-j),j*f[i-j]));
return f[n];
}
};
标签:maxProductAfterCutting,int,绳子,Solution,长度,public
From: https://www.cnblogs.com/tangxibomb/p/17231668.html