手机怎么制作网站教程视频教程,网站内链设置,中国工厂货源求购网,廊坊视频优化价格题目描述
给定一个正整数 n #xff0c;将其拆分为 k 个 正整数 的和#xff08; k 2 #xff09;#xff0c;并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。 示例 1:
输入: n 2
输出: 1
解释: 2 1 1, 1 1 1。
示例 2:
输入: n 10
输出: 36
解释…题目描述
给定一个正整数 n 将其拆分为 k 个 正整数 的和 k 2 并使这些整数的乘积最大化。
返回 你可以获得的最大乘积 。 示例 1:
输入: n 2
输出: 1
解释: 2 1 1, 1 × 1 1。
示例 2:
输入: n 10
输出: 36
解释: 10 3 3 4, 3 × 3 × 4 36。
思路
动态规划解决的经典类型题目之一。首先要明确dp数组的含义再找出状态转移方程并初始化迭代下去即可得出解。
dp[i]: 分拆数字i可以得到的最大乘积为dp[i]。注意数字 i 必须拆分即 i 不可以不拆。
状态转移方程要求dp[i]i可以拆分成两个、三个或者更多如果拆分成两个则dp[i]j*(i-j)其中j在0到i之间如果拆分成三个以上则dp[i]j*dp[i-j]我们只需在二者之间取较大值即可。得 dp[i] max((i - j) * j, dp[i - j] * j)
初始化根据状态转移方程和dp数组的定义易知dp[1]1,dp[2]1;
解法
C版本 Java版本