【剑指】77,剪绳子(规律:基于2,3)

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

思路:
首先明确有两个数和不变,两个数越相近乘积越大的原理。但是这个题不是这样做的。
我们先写出前几个找找规律:
4 : 2*2

  • 5 : 2*3
  • 6 : 3*3
  • 7 : 223 或者4*3
  • 8 : 233
  • 9 : 333
  • 10:2233 或者43*3
  • 11:233*3
  • 12:333*3
  • 13:22333 或者433*3
    当number/3余数为零时就全为三;当余数为1时,拿出一个3来组成4;当余数为2时直接为2即可。基于此的代码:
    ok!
    代码:
class Solution {
public:
    int cutRope(int number) {
		if(number==2)		//因为number是从1开始的!problem
			return 1;		//因为分的段数目>1
		if(number==3)
			return 2;
		int count3=number/3;		//3的个数
		int remainder=number%3;
	if(remainder==1)
		return pow(3,count3-1)*4;
	else if(remainder==0)
		return pow(3,count3);
	else
		return pow(3,count3)*2;
}
//这个的代码是错误的:当8时,结果应该为18.
/*class Solution {
public:
    int cutRope(int number) {
    int end=number/2+1;		//需要计算的最后一个数
        vector<int> dp(end,0)
        if(number<=1)
        	return 0;
        else if(number==2)
        	return 1;
        else if(number==3)
        	return 2;
        dp[0]=0,dp[1]=0,dp[2]=1,dp[3]=3;
        for(int i=4;i<=end;++i)
        	{
        		dp[i]=dp[i/2]*[i-i/2];
        	}
        	
        		return dp[end-1]*dp[end-1];
    }*/
};

书海无涯,且行且喜

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值