动态规划--整数拆分

题目描述

给定一个正整数 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++版本

动态规划--整数拆分_第1张图片

Java版本

动态规划--整数拆分_第2张图片

你可能感兴趣的:(动态规划,算法)