原理
- 问题分析与状态定义
- 题目要求将一个正整数
n
拆分成至少两个正整数的和,然后求这些正整数的最大乘积。定义状态dp[i]
表示将整数i
拆分后得到的最大乘积。 - 对于整数
i
,我们可以尝试将其拆分成j
和i - j
两部分(其中j
的取值范围是从1
到i - 1
),然后对于i - j
这部分,它又有两种情况:一是不再继续拆分,直接就是i - j
;二是继续拆分,其最大乘积就是dp[i - j]
。所以我们需要比较这几种情况乘积的大小,取最大值作为dp[i]
的值,由此得到状态转移方程。
- 题目要求将一个正整数
- 边界条件确定
- 当
n = 2
时,因为至少要拆分成两个正整数,只能拆分成1 + 1
,其乘积为1
,所以dp[2] = 1
,这是后续动态规划计算的起始边界值。
- 当
步骤
- 动态规划数组初始化
- 创建一个大小为
n + 1
的vector
数组dp
,用于存储将每个整数从2
到n
拆分后能得到的最大乘积,并将dp[2]
初始化为1
,作为边界条件。
- 创建一个大小为
- 动态规划计算
- 通过外层循环从
3
开始遍历到n
,对于每一个整数i
(表示当前要处理的整数),使用内层循环从1
到i - 1
遍历,尝试将i
拆分成j
和i - j
两部分(j
为拆分出来的其中一个数)。 - 对于每一种拆分情况,计算三种可能乘积中的最大值来更新
dp[i]
:- 第一种是
j * (i - j)
,表示i - j
这部分不再拆分,直接计算它们的乘积。 - 第二种是
j * dp[i - j]
,表示i - j
这部分继续拆分,其最大乘积为dp[i - j]
,再与j
相乘。 - 然后取这两种情况以及当前
dp[
- 第一种是
- 通过外层循环从