zoukankan      html  css  js  c++  java
  • 牛客网-剪绳子(动态/贪婪)

    题目描述

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

    代码

    # -*- coding:utf-8 -*-
    class Solution:
        def cutRope(self, number):
            # write code here
            if number == 2:
                return 1
            if number==3:
                return 2
            #找规律得到的,剪m段。number为偶数时m值为number//2-1,为奇数时m=number//2.
            if number%2==0:
                m = number//2-1
            else:
                m = number//2
            #若number可以整除m,则乘积为m个(number)/m相乘。若不可整除则每次乘a = (number//m+1)+1,number减a,直到number小于a。
            b = float(number)/m
            a = number//m
            result = 1
            if a==b:
                result = a**m
            else:
                while(number>(a+1)):
                    result *= a+1
                    number -= a+1
                result *= number
            return result

    进阶代码

    动态规划求解问题的四个特征: 
    ①求一个问题的最优解; 
    ②整体的问题的最优解是依赖于各个子问题的最优解; 
    ③小问题之间还有相互重叠的更小的子问题; 
    ④从上往下分析问题,从下往上求解问题;

    贪婪解法: 当n大于等于5时,我们尽可能多的剪长度为3的绳子;当剩下的绳子长度为4时,把绳子剪成两段长度为2的绳子。 为什么选2,3为最小的子问题?因为2,3包含于各个问题中,如果再往下剪得话,乘积就会变小。 为什么选长度为3?因为当n≥5时,3(n−3)≥2(n−2)
     
    # -*- coding:utf-8 -*-
    class Solution:
        def cutRope(self, number):
            # write code here
            #动态规划
            if number==2:
                return 1
            if number==3:
                return 2
            #当n>=4时,dp(n)=max(dp(i)*dp(n-i))
    
            dp = [0,1,2,3]
            for i in range(4,number+1):
                maxre = 0
                for j in range(1,i//2+1):
                    maxre = dp[j]*dp[i-j] if maxre<dp[j]*dp[i-j] else maxre
                dp.append(maxre)
            return dp[number]
  • 相关阅读:
    探寻京东云核心竞争力的源泉
    在线公开课 | 教你如何自行搭建一个威胁感知大脑?
    推迟学习系统调用
    linux中未实现的系统调用
    man(2) V
    man(2) W
    图像叠加
    man(2) readv writev
    qt 视频播放
    ffmpeg参数
  • 原文地址:https://www.cnblogs.com/ditingz/p/12298093.html
Copyright © 2011-2022 走看看