首页 > 其他分享 >剪绳子

剪绳子

时间:2023-03-18 20:34:55浏览次数:28  
标签:maxProductAfterCutting int 绳子 Solution 长度 public

数学方法

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

相关文章

  • 【230312PH-1】如图,物体重700N,动滑轮重100N,站在地上的人拉住绳子的一端,使物体处于静止
    ......
  • 剪绳子
    给你一根长度为n的绳子,请把绳子剪成整数长度的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘积是多少?......
  • 每天一练(剑指offer)剪绳子
    描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]*k[2]*...*k[m]可能的......
  • 剪绳子问题 之动态规划 及 大数越界情况下的求余问题
    问题:剪绳子剑指Offer14-I.剪绳子-力扣(LeetCode)思路一:数学推导:分割大小为3时,是最优解,2次之; /3作为幂次,  %3作为分解到最后特化处理;特殊化处理:当分......
  • 每日算法之剪绳子
    JZ14剪绳子描述给你一根长度为n的绳子,请把绳子剪成整数长的m段(m、n都是整数,n>1并且m>1,m<=n),每段绳子的长度记为k[1],...,k[m]。请问k[1]*k[2]*........
  • 二分-剪绳子
    有N根绳子,第i根绳子长度为Li,现在需要M根等长的绳子,你可以对N根绳子进行任意裁剪(不能拼接),请你帮忙计算出这M根绳子最长的长度是多少。第一行包含2个正整数N、M,表示原始绳......
  • P1577 切绳子
    ​​传送门​​思路:用二分对答案mid进行枚举,若按照当前mid进行切割可获得的长度大于k,则l=mid+0.0001,否则r=mid-0.0001,最后用floor向下取整;#include<bits/stdc++.h>using......
  • 剑指Offer-14-剪绳子/力扣-343-整数拆分
    对于一段绳子,第一刀下去可以将绳子分成i和n-i两段,其中i的取值范围为[1,n-1]dp[n]表示n可分成的最大乘积和,dp[n]=max(dp[n],max(i*n-i,i*f(n-i)))初始化:全部初始化为1i......
  • 剑指 Offer 14- I. 剪绳子
    一、题目:给你一根长度为n的绳子,请把绳子剪成整数长度的m段(m、n都是整数,n>1并且m>1),每段绳子的长度记为k[0],k[1]...k[m-1]。请问k[0]*k[1]*...*k[m-1]可能的最大乘......
  • 切绳子
    切绳子思路:运用二分查找,与木材加工题的思路相同。只是这个是针对浮点数的,多了将绳子长度转化为整形,最后输出再转回高精度。代码如下:#include<iostream>usingnames......