剑指 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] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1

示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36

提示:

2 <= n <= 58

本题要求将某值n分成若干值(a1,a2,...,am-1),使得各值之和为n,并乘积为最大。考虑到相等的数相乘为最大,进行以下计算:

#长度为n,设分为x段乘积最大,则每段值为n/x,乘积为x的x/n的次方。
#由于n为常量,则只需要求出x的1/x次方的最大值即可。
from sympy.abc import x 
from sympy import *
y = x**(1/x)
fx = diff(y, x)
print(fx)
print(solve(fx))

实验结果

计算得到在x=e处时是y的极值,3最接近e,2次接近e,所以最优为每段长度为3,然后切为长度2,最后为长度1。

算法代码

class Solution {
    public int cuttingRope(int n) {
        int sum = 1;
        int c = 0;
        if(n < 3){
            return 1;
        }else if(n < 4){
            return 2;
        }
        if(n % 3 == 0){
            c = n/3;
            for(int i = 1; i <= c; ++i){
                sum = sum * 3;
            }
        }else if(n % 3 == 1){
            c = (n-4)/3;
            for(int i = 1; i <= c; ++i){
                sum = sum * 3;
            }
            sum = sum*4;
        }else{
            c = (n-2)/3;
            for(int i = 1; i <= c; ++i){
                sum = sum * 3;
            }
            sum = sum*2;
        }
        return sum;
    }
}

剪绳子Ⅱ

答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。

class Solution {
    public int cuttingRope(int n) {
        double sum = 1;
        int c = 0;
        if(n < 3){
            return 1;
        }else if(n < 4){
            return 2;
        }
        if(n % 3 == 0){
            c = n/3;
            for(int i = 1; i <= c; ++i){
                sum = (sum * 3) % (1e9+7);
            }
        }else if(n % 3 == 1){
            c = (n-4)/3;
            for(int i = 1; i <= c; ++i){
                sum = (sum * 3) % (1e9+7);
            }
            sum = (sum*4) % (1e9+7);
        }else{
            c = (n-2)/3;
            for(int i = 1; i <= c; ++i){
                sum = (sum * 3) % (1e9+7);
            }
            sum = (sum*2) % (1e9+7);
        }
        return (int)sum;
    }
}
posted @ 2021-03-07 17:48  锖兔真菰  阅读(54)  评论(0编辑  收藏  举报