• 剑指 Offer 14- I. 剪绳子


    剑指 Offer 14- I. 剪绳子

    地址:剑指 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
    注意:本题与主站 343 题相同:https://leetcode-cn.com/problems/integer-break/

    object Solution {
        def cuttingRope(n: Int): Int = {
            if (n <= 3) {
                return 1 * (n-1)
            }
    
            var num = n
            var p = 1
            //5以上的数字均可使用2 3进行分割
            while (num >= 5) {
                num -= 3
                p *= 3
            }
    
            return p * num
        }
    }
    
    //动态规划
    func cuttingRope(n int) int {
        dp := make([]int, n+1)
        dp[1] = 1
        for i := 2; i <= n; i++ {
            for j := 1; j < i; j++ {
                //j表示j不可分,dp[j]表示j任可分割
        		//取多种情况的最大值
                dp[i] = max(dp[i], max(j ,dp[j]) * max((i-j), dp[i-j])) 
            }
        }
        return dp[n] 
    }
    
    func max(i ,j int) int{
        if i > j {
            return i
        } else {
            return j
        }
    }
    
  • 相关阅读:
    用好C++的智慧
    git patch
    ORACLE 11G导入数据报ORA-12154错误解析
    graphviz
    resource for better user experiences
    reference
    xv6
    common use tools provided as website
    eclipse plugins
    Massive Online Open Course sites
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/14151074.html
Copyright © 2020-2023  润新知