首页 🍒LeetCode,🐶算法

题目

0.png

思路:DP

定义dp[n]表示长度为n的绳子最大乘积。

一段长度为n的绳子,切第一刀共有n-1种情况,即第一刀绳子的长度为1, 2, 3....n-1。然后再在这些绳子中继续切寻找最大值,切出来的两段绳子可以看做是两条新的绳子dp[i]dp[n-i],我们有这两条绳子的最大乘积,也就有了长度为n的绳子的知道乘积。

所以dp[n] = max(dp[i] * dp[n-i])

dp[0], dp[1], dp[2], dp[3]为特殊情况,特判即可。
func cuttingRope(n int) int {
    if n == 2 {
        return 1
    }
    if n == 3 {
        return 2
    }
    dp := make([]int, 59)
    dp[0] = 0
    dp[1] = 1
    dp[2] = 2
    dp[3] = 3
    for i := 4; i <= n; i++ {
        m := 0
        for j := 1; j <= i/ 2; j++ {
            if dp[j]*dp[i-j] > m {
                m = dp[j] * dp[i-j]
            }
        }
        dp[i] = m
    }
    return dp[n]
}

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=25rtvweals4k8




文章评论