剪绳子(剑指offer)

一、题目描述

题目来源:

剑指offer

题目详述:

给你一根长度为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。

输入描述

输入一个数n,意义见题面。(2 <= n <= 60)

输出描述

输出答案。

示例:
输入

8

输出

16

二、问题详解

长度为 n 的绳子,剪出的子绳子长度之积最大值为 Max[n]
假设先剪出一段长度为 i 的子绳子,那么***Max[n]*** 就等于 i * Max[n-i] ,所以问题就可以用 动态规划 的思路解决。
n = 2 时,Max[n] = 1 ;
n = 3 时,Max[n] = 2 ;
n > 3 时, Max[n] = i*Max[n-i] ; 其中 i 的范围是***[1, n-1]***

三、程序编写(python)

# -*- coding:utf-8 -*-
class Solution:
    def cutRope(self, number):
        # write code here
        MaxMulti = [0, 1, 1, 2]+[0] * (number-3)
        if number<4:
            return MaxMulti[number]
        for i in range(2, number + 1):
            curMax = i
            for j in range(1, i):
                curMax = max(j * MaxMulti[i-j], curMax)
            MaxMulti[i] = curMax
        return MaxMulti[number]

四、提交结果

剪绳子(剑指offer)_第1张图片

你可能感兴趣的:(剑指offer)