闫氏DP分析法应用

闫氏DP分析法应用:最大化整数拆分问题


1. 状态表示(化零为整)

1.1 集合的定义

我们首先需要定义一个表示状态的集合。我们将考虑拆分的所有可能性,并且定义集合的属性:

  • 集合:( S(n) ) 表示所有拆分整数 ( n ) 的方案集合。

    • 每个拆分方式由若干个正整数组成,这些正整数之和为 ( n )。
    • 例如,( S(5) ) 的拆分方式有 ( (4, 1), (3, 2), (2, 2, 1), (1, 1, 1, 1, 1) ),每个拆分方式的乘积也需要计算。
  • 属性:我们需要最大化这些拆分方式的乘积。因此,( dp[n] ) 表示整数 ( n ) 的最大拆分乘积。

具体地:

  • 状态表示:对于给定的 ( n ),( dp[n] ) 表示整数 ( n ) 拆分后的最大乘积。

2. 状态计算(化整为零)

在状态表示明确后,我们需要设计状态转移方程,推导出如何从小的子问题推导到大的问题。

2.1 子集划分:

为了计算 ( dp[n] ),我们考虑将 ( n ) 拆分成两个部分 ( j ) 和 ( n-j )。对于每个 ( j )(( 1 \leq j < n )),我们有两种情况:

  • 不选 ( n-j ) 继续拆分:如果选择拆分为 ( j ) 和 ( n-j ),那么直接计算它们的乘积 ( j \times (n-j) )。

  • 选 ( n-j ) 继续拆分:如果 ( n-j ) 继续拆分,使用已求得的最优解 ( dp[n-j] ),并计算乘积 ( j \times dp[n-j] )。

因此,状态转移的关键是选择每个 ( j ) 对应的拆分方式,并计算它们的最大乘积。

2.2 状态转移方程:

根据以上分析,我们可以得到状态转移方程:
d p [ n ] = max ⁡ 1 ≤ j < n { max ⁡ ( j × ( n − j ) , j × d p [ n − j ] ) } dp[n] = \max_{1 \leq j < n} \{ \max(j \times (n-j), j \times dp[n-j]) \} dp[n]=1≤j<nmax{max(j×(n−j),j×dp[n−j])}

  • 解释
    • 第一部分 ( j \times (n-j) ) 表示不再拆分 ( n-j ) 的情况,直接计算拆分 ( j ) 和 ( n-j ) 的乘积。
    • 第二部分 ( j \times dp[n-j] ) 表示继续递归拆分 ( n-j ),然后乘上 ( j )。
2.3 初始化条件:

为了开始递推,我们需要初始化一些基础值:

  • ( dp[1] = 1 )(虽然不拆分,但这是递归的基准)。
  • ( dp[2] = 1 )(2 拆分为 1 和 1,乘积为 1)。

3. 示例推导 ( n = 5 )

接下来,我们使用闫氏DP分析法,逐步计算 ( dp[5] ):

3.1 初始化
  • ( dp[1] = 1 )
  • ( dp[2] = 1 )
3.2 递推计算 ( dp[3] )

我们根据状态转移方程计算 ( dp[3] ):

  • 对于 ( j = 1 ):( dp[3] = \max(1 \times 2, 1 \times dp[2]) = \max(2, 1) = 2 )
  • 对于 ( j = 2 ):( dp[3] = \max(2 \times 1, 2 \times dp[1]) = \max(2, 2) = 2 )

因此,( dp[3] = 2 )。

3.3 递推计算 ( dp[4] )

继续递推,计算 ( dp[4] ):

  • 对于 ( j = 1 ):( dp[4] = \max(1 \times 3, 1 \times dp[3]) = \max(3, 2) = 3 )
  • 对于 ( j = 2 ):( dp[4] = \max(2 \times 2, 2 \times dp[2]) = \max(4, 2) = 4 )
  • 对于 ( j = 3 ):( dp[4] = \max(3 \times 1, 3 \times dp[1]) = \max(3, 3) = 3 )

因此,( dp[4] = 4 )。

3.4 递推计算 ( dp[5] )

最终计算 ( dp[5] ):

  • 对于 ( j = 1 ):( dp[5] = \max(1 \times 4, 1 \times dp[4]) = \max(4, 4) = 4 )
  • 对于 ( j = 2 ):( dp[5] = \max(2 \times 3, 2 \times dp[3]) = \max(6, 4) = 6 )
  • 对于 ( j = 3 ):( dp[5] = \max(3 \times 2, 3 \times dp[2]) = \max(6, 3) = 6 )
  • 对于 ( j = 4 ):( dp[5] = \max(4 \times 1, 4 \times dp[1]) = \max(4, 4) = 4 )

因此,( dp[5] = 6 )。

最终答案:( dp[5] = 6 )


相关推荐
BUG收容所所长24 分钟前
二分查找的「左右为难」:如何优雅地找到数组中元素的首尾位置
前端·javascript·算法
itsuifengerxing1 小时前
python 自定义无符号右移
算法
猎板PCB厚铜专家大族2 小时前
高频 PCB 技术发展趋势与应用解析
人工智能·算法·设计规范
dying_man2 小时前
LeetCode--24.两两交换链表中的结点
算法·leetcode
yours_Gabriel2 小时前
【力扣】2434.使用机器人打印字典序最小的字符串
算法·leetcode·贪心算法
草莓熊Lotso2 小时前
【数据结构初阶】--算法复杂度的深度解析
c语言·开发语言·数据结构·经验分享·笔记·其他·算法
KyollBM3 小时前
【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
c语言·c++·算法
CV点灯大师3 小时前
C++算法训练营 Day10 栈与队列(1)
c++·redis·算法
GGBondlctrl3 小时前
【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目
算法·leetcode·n皇后·有效的数独·解数独·映射思想·数学思想
武子康3 小时前
大数据-276 Spark MLib - 基础介绍 机器学习算法 Bagging和Boosting区别 GBDT梯度提升树
大数据·人工智能·算法·机器学习·语言模型·spark-ml·boosting