首页 > 试题广场 >

编程题 【问题描述】 给你一根长度为n的绳子,请把

[问答题]
编程题
【问题描述】
给你一根长度为n的绳子,请把绳子剪成m段 (m和n都是整数,n>1并且m>1)每段绳子的长度记为k[0],k[1],...,k[m].请问k[0]*k[1]*...*k[m]可能的最大乘积是多少?
【要求】
【数据输入】绳子长度,一个整型数n(n>1)
【数据输出】把绳子剪成m段后, 可能的最大乘积数,也是一个整型数
【样例输入】
绳子的长度n=9
【样例输出】
我们把它剪成长度分别为3,3,3的三段,此时得到的最大乘积是3*3*3=27

class Solution{

public:

    int get_max(int n){

        if(n<1)

            return 0;

        // 特殊情况

        if(n==2)  return 1;

        if(n==3 ) return 2;

        // 用3来进行分割可以使得乘积变得最大

        // 要分析特征情况:比如n=4的时候,就不能分割成1*3,而必须是2*2

        int sum = 1;

        while(n>4){

                n -= 3;

                sum *= 3;

            }

        // 这里包括最后n=2和n=4,结果都是乘以自身最大

        return sum*n;

    }

};

发表于 2019-06-01 12:02:00 回复(0)
public int integerBreak(int n) {
if (n == 2) return 1;
if (n == 3) return 2;
int ans = 1;
while (n > 4) {
ans *= 3;
n -= 3;
}
return ans * n;
}
leetcode->343. Integer Break
编辑于 2019-04-12 13:02:09 回复(0)
#include <iostream>
#include<vector>
using namespace std;
int calLongest(int n, vector<int>maxLongest) {

    /*    if (n == 1)
            maxLongest[1]= 1;
        if (n == 2)
            maxLongest[2]=2;
        if (n == 3)
            maxLongest[3]=3;*/
    for (int i = 4; i <= n; i++) {
        for (int j = i - 1; j > 0; j--) {
            if (maxLongest[j] * maxLongest[i - j] >=maxLongest[i])
                maxLongest[i] = maxLongest[j] * maxLongest[i - j];
        }
    }
    return maxLongest[n];
}
int main() {
    int n;
    cin >> n;
    vector<int>maxLongest;
    for (int i = 0; i <= n; i++)
        maxLongest.push_back(i);
    cout << calLongest(n, maxLongest) << endl;
    return 0;
}

发表于 2019-04-04 16:31:07 回复(0)
package Wangben;

import java.util.Scanner;

public class Main {
public static void main(String[] args){
	Scanner sc = new Scanner(System.in);
	int n=sc.nextInt();
	int m=n/3;
	if( n % 3 ==0){
		System.out.println(Math.pow(3, n));
	} else if(n % 3 ==1){
		System.out.println(Math.pow(3, m-1)*4);
	}else {
		System.out.println(Math.pow(3, m) * (n % 3));
	}
}
}

发表于 2019-12-19 14:12:15 回复(0)
    在推导后也许能得到时间复杂度为logn的解法。   

    在不限定乘积数为整数的前提下,可知:均匀分段得到的乘积最大,由此可列出乘积结果y与分段数m之间的式子,并通过求导得知分段数的最优解为绳子长度除以自然常数,即n/e。

    由于绳子长度为整数,能最大化乘积结果的段数m应为n/e的向下取整和向上取整两个的两个数之一,求max就好。例如n=6 ,n/e = 2.21,段数m应为2或者3,计算得知m=2时,乘积最大,为9。

    但大多数时候乘积ymax并不刚好就是整数,但一定可以通过微调每段长度的分配达到ymax向下取整的结果(题目只说了乘积为整数,没说每段长度必为整数,也没有要求给出每段长度)。例如n=10,n/e = 3.69,计算后发现最大乘积为(n/4)**4 = 39.0625,按照题目要求结果应取39。

    万一限定每段长度也为整数,可以通过限定每段长度为n/e的向下取整和向上取整两个的两个数之一。例如n=10,n/e = 3.69,上下界分别为3和4,段数总数m为int(n/3)=3,取4的段数m4为n - m*3 = 1,取3的段数m3为m - m4 = 2。乘积结果为3*3*4 = 36。

    可见大部分步骤都是常数级运算,唯独计算最大乘积时,若不限定每段长度为整数,则为一个求次方问题,可使用快速幂算法解决,时间复杂度为logm(由于m=n/e,也就等于logn)。若限定每段长度为整数,其实是求两个小次方数之积,复杂度也差不多。

    
发表于 2019-08-16 21:16:18 回复(1)
class Solution:
    def maxProductAfterCutting(self, n):
        # write code here
        if n<=3:
            return 1*(n-1)
        if n%3==1:
            num3=n//3-1
            num2=(n-3*num3)//2
        elif n%3==2:
            num3=n//3
            num2=(n-3*num3)//2
        else:
            num3=n//3
            num2=0
        return pow(3,num3)*pow(2,num2)
编辑于 2019-07-21 16:15:46 回复(1)
def cut(num):
    nsqrt = int(num // 2) + 1 # 向上取整   
​    mmax = 1  for x in range(2, nsqrt):
        y = num - x 
​        if y not in multis.keys():
            multis[y] = cut(y)
        mx = max(multis[x], x)
        my = max(multis[y], y)
        temp = mx * my 
​        if temp > mmax:
            mmax = temp 
​    return mmax 
​    pass
​   
​if __name__ == '__main__': 
​    # N = int(input().strip())  
​    N = 9   
​    if N < 2: 
​        print('N must be not less than 2!')
    multis = {2: 1, 3: 2}
    mmax = cut(N) 
​    print(mmax)  
​    pass 

直接求解法,递归方式:

每一段长度都根据已有的长度进行划分和计算,比如:

绳长为2米时,最大乘积为1,记为multis[2]=1;此时的拆分形式为1+1;

绳长为3米时,最大乘积为2;记为multis[3]=2;此时的拆分形式为1+2;

绳长为4米时,最大乘积为4;

其中4可拆分为1+3,2+2,3+1;

以1+3为例,因为multi[3]multis[3],此时乘积为1x3=3);

按照这种方式,分别计算每种拆分方式下的乘积,直到拆分组合N/2+1与N-(N/2+1);

然后找出其中的最大值,即为当前绳长下的最大乘积。

编辑于 2019-07-16 17:00:29 回复(0)
public class MaxProductAfterCut {
    public int maxProductAfterCut(int length) {
        int max = 0;
        if(length<2) return 0;
        if(length==2) return 1;
        if(length==3) return 2;
        int products[]=new int [length+1];
        products[0]=0;
        products[1]=1;
        products[2]=2;
        products[3]=3;
        for(int i=4;i<=length;++i) {
            max = 0;
            for(int j=1;j<=i/2;++j) {
                int product = products[i-j]*products[j];
                if(max<product) max = product;
                products[i] = max;
            }
        }
        max = products[length];
        System.out.println(max);
        return max;
    }
}
动态规划,Java版
编辑于 2019-07-04 17:49:01 回复(0)
#include<iostream>
using namespace std;
int main(){
    int num;
    while(cin>>num){
        if(num < 2)
            return 0;
        if(num == 2)
            return 1;
        if(num == 3)
            return 2;
        int *product = new int [num+1];
        product[0]=0;
        product[1]=1;
        product[2]=2;
        product[3]=3;
        for(int i = 4; i <= num; i++){
            int max = 0;
            for(int j = 0; j < i/2; j++){
                int products = product[j]*product[i-j];
                if(max < products)
                   max = products;
                    product[i] = max;
            }
        }
        max = product[num];
        delete[] product;
        cout << max << endl;
    }
    return 0;
}
发表于 2019-07-01 17:26:53 回复(0)
#include<iostream>
#include<math.h>
using namespace std;
int x(int m)
{
    int a=2,k=m;
    while( k < pow( m / a , a-1 ) * ( m - m/a * (a-1) ) )
    {
        k = pow( m / a , a-1 ) * ( m - m/a * (a-1) ) ;
        a++;    
    }
    for(int i=1;i<a-1;i++)
    printf("%d*",m/(a-1));
    printf("%d=", m - m/ (a-1) * (a-2) );
    return k;
}
int main()
{
    int m;
    cin>>m;
    cout<<x(m)<<endl;    
} 


发表于 2018-08-28 12:30:27 回复(0)
class Solution:
    def maxProductAfterCutting(self, n):
        # write code here
        if n < 2 :
            return 0
        elif n == 2:
            return 1
        # elif n == 3:
        #     return 2
        max_list = [0,1,2]
        for i in range(3,n+1):
            if i < n :
                max = i
            else:
                max = 0
            for j in range(1,i//2+1):
                tmp = max_list[j]*max_list[i-j]
                if tmp > max:
                    max = tmp
            max_list.append(max)
        return max_list[n]
 


发表于 2018-08-21 11:50:26 回复(0)