剑指offer——剪绳子

文章讨论了给定绳子长度n,如何通过动态规划找到将其剪切成整数长m段时最大乘积的算法。Java代码实现中,通过遍历和比较不同长度组合的乘积,得出最优解,时间复杂度为O(n^2),空间复杂度为O(n)。
摘要由CSDN通过智能技术生成

题目描述:给你一根长度为n的绳子,请把绳子剪成整数长的m段(mn都是整数,n>1并且m>1m<=n),每段绳子的长度记为k[1],...,k[m]...。请问k[1]x...xk[m]可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为233的三段,此时得到的最大乘积是18。

输入描述:输入一个数n,(2 <= n <= 60)

返回值描述:输出答案

示例1:

输入: 

8

返回值:

18

思路及解答:

每个长度的绳子,要么最长的情况是不剪开(长度是本身),要么长度是剪开两端的乘积。因此每个长度length都需要遍历两个相加之后等于length的乘积,取最大值。初始化值 长度为1的值为1,从长度为2开始,每种长度都需要遍历两个字长度的乘积。

Java实现代码如下所示:

public class Solution{
    public int cutRope(int target){

        if(target <= 1){
            return target;
        }
        int[] nums = new int[target + 1];
        nums[1] = 1;
        nums[0] = 1;
        for(int i = 2 ; i <= target ; i++){
            int max = i;
            for(int j = 0 ; j <= i/2 ; j++){
                int temp = nums[j] * nums[i -j];
                if(temp > max){
                    max = temp;
                }
            }
            nums[i] = max;
        }
        return nums[target];
    }
}

采用动态规划的方法来解题:假设绳子长度为n的最大的长度为f(n),那么如何计算f(n)?

f(n)可能是n,不切分的情况下

f(n)可能是f(n-1)和f(1)的乘积

f(n)可能是f(n-2)和f(2)的乘积

……

因此,要想求f(n),我们必须先把f(n-1),f(n-2)……之类的前面值先求出来,f(1) = 1,这是初始值

Java实现代码如下所示:

public class Solution{
    public int cutRope(int target){\

        int[] dp = new int[target + 1];
        dp[1] = 1;
        for(int i = 2 ; i <= target ; i++){
            for(int j = i ; j < i ; j++){
                dp[i] = Math.max(dp[i], (Math.max(j,dp[j])) * (Math.max(i - j,dp[i -j])));
            }
        }  
        return dp[target];  
    }     
}

时间复杂度:O(n^2) 空间复杂度:O(n),需要创建额外的二维数组

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅亦予

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值