剑指offer8:剪绳子问题(动态规划和贪婪算法)

内容:

给定一根长度为n的绳子,请把绳子剪成m段,每段绳子记为k[0],k[1]……k[m]。请问k[0]*k[1]……*k[m]可能的最大乘积是多少?例如:当绳子长度为8时,我们把它剪成长度分别为2,3,3段,此时最大乘积为18.

解题思路:

思路一:我们先考虑能否把大问题分解成小问题,分解后的小问题也存在最优解,如果把小问题的最优解组合起来能否是整个问题的最优解,这就是动态规划求解。我们把绳子从第i(i<n)处的位置开始剪,把长度分为i和n-i,要得到最优解用同样的方法把长度为i和n-i的两段分别剪成若干段。在这里用动态规划是因为:在分解问题的时候,子问题会在分解的过程中重复出现,如,长度为10的绳子剪成长度为4和6两段,即f(4)和f(6),分别再求两个子问题把4剪成均为2的两段f(2)和f(2),把6剪成两段2和4,即f(2)和f(4),这时f(2)是f(4)和f(6)公用的更小子问题,这时用动态规划从上往下分析问题,从下往上解决问题。空间复杂度为O(n),时间复杂度为O(n^2)

代码实现:

int maxlength(int a[],int length)
{
        if (length < 2)
		return 0;
	if (length == 2)
		return 1;
	if (length == 3)
		return 2;
		int i = 4;
		while (i <= length){
			int j = 1;
			while (j <= i / 2){
				if 
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值