剪绳子

数学方法

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];
    }
};
posted @   穿过雾的阴霾  阅读(17)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示