剪绳子
数学方法
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];
}
};
有帮助的话可以点个赞,我会很开心的~
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?