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]
  • 相关阅读:
    【Java-算法】 计算十六进制校验位
    【Android-Zxing框架】二维码扫描框区域大小与不同手机分辨率适配问题
    【Android-开发环境】 eclipse开发环境搭建
    【Android-布局复用】 多个界面复用一个布局文件(二)
    【Android-布局复用】 多个界面复用一个布局文件(一)
    QQ群打卡脚本
    Linux CentOS 方舟生存进化开服教程[转]
    jwt认证

    drf
  • 原文地址:https://www.cnblogs.com/ditingz/p/12298093.html
Copyright © 2011-2022 走看看