作者回复: 没有问题,通过滚动数组来优化空间复杂度。
作者回复: 这句话的意思是DP[i][j] 表示将数组的前 i 个元素划分为 j 个子数组时的最优解,但是这个最优解里不一定包含第i个元素(也就是最大重叠子数组并没有选择第i个元素作为子数组的一部分),所以我们需要分情况来讨论。 至于下面的三种情况也就是最优解的三种情况: 1. 第i个元素并不在将前i个元素划分为j个子数组的最优解中,因此D[i][j]其实也就是DP[i-1][j] 2. 前i个元素划分为j个子数组的最优解中包含第i个元素,这个时候需要考虑两种情况。第一种情况是将前i-1个元素划分成了j个子数组,这个时候需要把第i个元素放到第j个子数组中,也就是原文中情况2。第二种情况是将前i-1个元素划分成j-1个子数组,第i个元素单独作为一个新的子数组,形成j个数组。
作者回复: 排序还需要先构造数组,然后做排序。由于这里只有三个元素,因此这样处理是合适的,可以不把简单的问题复杂化。
作者回复: 专程前来给你点赞
作者回复: 课程里有阐述: DP[i][j] 表示将数组的前 i 个元素划分为 j 个子数组时的最优解 M[i][j]表示将数组的前 i 个元素划分为 j 个子数组,并且第 i 个元素一定在第 j 个数组中时的最优解 由于DP[i][j]中求最优解时需要知道DP[i][j] 中的第 i 个元素一定在第 j 个数组中时的最优解,而DP[i][j]本身并没有这个性质,因此需要M[i][j]辅助求解DP[i][j]
作者回复: 是的,现在可以这样写。 C99和C++14标准之后支持变长数组(VLA),也就是支持用变量作为数组长度(gcc中的c++也早就支持这个扩展了),虽然C++14和C99的VLA语义不完全一致,不过现在的确是可以这样写的。
作者回复: 示意图和代码应该是相符的,文中,这里i表示的是元素,j表示子数组的数量。 至于你这里的状态需要考虑一下是否能够真的得到全局最优解。
作者回复: 这里是笔误,输出的确是10,非常感谢。
作者回复: 这里 其实j的计算顺序不会影响最后的结果,倒推或正推都是可以的
作者回复: 这个可以用动态规划解决,思路可以参照最大子数组之积的思路。