Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

343. 整数拆分 #51

Open
yankewei opened this issue Jul 30, 2020 · 1 comment
Open

343. 整数拆分 #51

yankewei opened this issue Jul 30, 2020 · 1 comment
Labels
动态规划 题目包含动态规划解法 简单 题目难度为简单

Comments

@yankewei
Copy link
Owner

给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。

示例 1:

输入: 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

示例 2:

输入: 10
输出: 36
解释: 10 = 3 + 3 + 4, 3 × 3 × 4 = 36。

说明: 你可以假设 n 不小于 2 且不大于 58。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/integer-break

@yankewei yankewei added 动态规划 题目包含动态规划解法 简单 题目难度为简单 labels Jul 30, 2020
@yankewei
Copy link
Owner Author

yankewei commented Jul 30, 2020

动态规划

可以多次拆分,求最大值,可以使用动态规划。
设置一个数组dp,0和1是无法再被拆分的,所以dp[0]和dp[1]都是0,然后我们假设n拆分出来的一个正整数是k,那么剩下的就是n-k,现在就有两种情况了:

  1. n-k不再拆分,那么结果就是dp[n] = k * n-k
  2. n-k还可以再被拆分,那么结果就是 dp[n] = k * dp[n-k]
    到这里,状态转移方程就出来了,dp[n] = max(k * (n-k), k * dp[n-k])
Go
func integerBreak(n int) int {
    dp := make(map[int]int, n)
    dp[0] = 0
    dp[1] = 0
    for i := 2; i <= n; i++ {
	v := 0
	for j := 1; j < i; j++ {
	    v = max(v, max(j*(i-j), j*dp[i-j]))
	}
	dp[i] = v
    }
    return dp[n]
}

func max(x, y int) int {
    if x > y {
	return x
    }
    return y
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
动态规划 题目包含动态规划解法 简单 题目难度为简单
Projects
None yet
Development

No branches or pull requests

1 participant