JAVA算法:剪绳子获得最大乘积 — 动态规划

JAVA算法:剪绳子获得最大乘积 — 动态算法

给定一根长度为N米的绳子,以最大化所有部分长度的乘积的方式,将绳子切割成不同部分的整数长度。你必须至少切一刀。

假设绳索长度超过2米。

例如:

输入: n = 2
输出: 1 (获得的最大乘积是: 1*1)

输入: n = 3
输出: 2 (获得的最大乘积是: 1*2)

输入: n = 4
输出: 4 (获得的最大乘积是: 2*2)

输入: n = 5
输出: 6 (获得的最大乘积是: 2*3)

输入: n = 10
输出: 36 (获得的最大乘积是: 3*3*4)

问题分析

最优子结构

这个问题类似于木棒切割问题。我们可以通过在不同位置进行切割并比较切割后获得的值来得到最大的积。对于切割后获得的工件,我们可以递归调用相同的函数。

假设maxprod(n)是长度n的绳子的最大积。maxprod(n)可以写如下:

maxProd(n) = max(i*(n-i), maxProdRec(n-i)*i)  其中 i 的取值范围为: {1, 2, 3 .. n}

重叠的子问题

下面是这个问题的简单递归实现。实现只遵循上面提到的递归结构。 

package com.bean.algorithm.basic;

public class CutForMaxProduct {
	// Java program to find maxium product
	// The main function that returns
	// maxim
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值