动态规划3--分割整数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划3--分割整数相关的知识,希望对你有一定的参考价值。

参考技术A

343. 整数拆分

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

示例 1:

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

示例 2:

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

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

分析:好难呐~~~
根本没有状态转移方程的思路5555~

动态规划五部曲:
1、确定dp数组以及下标含义
dp[i]表示整数i对应的最大乘积,不论拆成几部分。

2、确定状态转移方程

3、dp数组的初始化
拆分成0*n时,乘积为0,初始化dp[]=0;

4、确定遍历的顺序

5、举例检验

时间复杂度:O(n^2);空间复杂度:O(n)

动态规划(分割整数)---按平方数分割整数

最长递增子序列

??已知一个序列 S1, S2,...,Sn,取出若干数组成新的序列 Si1, Si2,..., Sim,其中 i1、i2 ... im 保持递增,即新序列中各个数仍然保持原数列中的先后顺序,称新序列为原序列的一个 子序列

??如果在子序列中,当下标 ix > iy 时,Six > Siy,称子序列为原序列的一个 递增子序列

??定义一个数组 dp 存储最长递增子序列的长度,dp[n] 表示以 Sn 结尾的序列的最长递增子序列长度。对于一个递增子序列 Si1, Si2,...,Sim,如果 im < n 并且 Sim < Sn,此时 Si1, Si2,..., Sim, Sn 为一个递增子序列,递增子序列的长度增加 1。满足上述条件的递增子序列中,长度最长的那个递增子序列就是要找的,在长度最长的递增子序列上加上 Sn 就构成了以 Sn 为结尾的最长递增子序列。因此 dp[n] = max dp[i]+1 | Si < Sn && i < n 。

??因为在求 dp[n] 时可能无法找到一个满足条件的递增子序列,此时 Sn 就构成了递增子序列,需要对前面的求解方程做修改,令 dp[n] 最小为 1,即:

??dp[n]=max1,dp[i]+1|Si<Sn&&i<n

??对于一个长度为N的序列,最长递增子序列不一定会以Sn为结尾,因此dp[N]不是序列的最长递增子序列的长度,需要遍历dp数组找出最大值才是所要的结果。

以上是关于动态规划3--分割整数的主要内容,如果未能解决你的问题,请参考以下文章

动态规划(分割整数)---按平方数分割整数

算法设计与分析——划分问题(动态规划)

动态规划最大K乘积问题

不同路径(数学动态规划)逆序输出(排序)分割回文串(字符串动态规划)

破解大厂算法面试最难动态规划题:将数组分割成元素和相等的两部分

动态规划(斜率优化):BZOJ 3675 [Apio2014]序列分割