青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

49 阅读3分钟

第272最大化糖果美味值问题 这题思路如下: 状态定义: 设 dp[i] 表示在前 i 个糖果中,选择糖果的最大美味值之和。 状态转移方程: 对于每个糖果 i,我们有两种选择: 不选择第 i 个糖果,那么 dp[i] = dp[i-1]。 选择第 i 个糖果,那么 dp[i] = dp[i-3] + a[i-1](因为选择了第 i 个糖果,不能选择第 i-1 和 i-2 个糖果)。 因此,状态转移方程为: plaintext dp[i] = max(dp[i-1], dp[i-3] + a[i-1])

初始化: dp[0] = 0(没有糖果时,美味值之和为0)。 dp[1] = a[0](只有一个糖果时,美味值之和为该糖果的美味值)。 dp[2] = max(a[0], a[1])(只有两个糖果时,选择美味值较大的那个)。 边界条件处理: 当 i < 3 时,dp[i] 的计算需要特别处理,因为 dp[i-3] 可能不存在。 最终结果: 最终的最大美味值之和为 dp[n]。 具体步骤 初始化数组: 创建一个长度为 n+1 的数组 dp,并初始化 dp[0] 为 0。 填充数组: 从 i = 1 到 n,根据状态转移方程填充 dp 数组。 返回结果: 返回 dp[n] 作为最终结果。 示例 假设 n = 7,a = [3, 1, 2, 7, 10, 2, 4]: dp[0] = 0 dp[1] = 3 dp[2] = max(3, 1) = 3 dp[3] = max(3, 0 + 2) = 3 dp[4] = max(3, 3 + 7) = 10 dp[5] = max(10, 3 + 10) = 13 dp[6] = max(13, 10 + 2) = 13 dp[7] = max(13, 13 + 4) = 17 最终结果为 dp[7] = 17。 总结 这是这题用到的知识点: 动态规划:

动态规划是一种通过将复杂问题分解为更小的子问题来解决问题的方法。它通常用于优化递归算法,避免重复计算相同的子问题。 在这题中,dp 数组用于存储子问题的解,从而避免重复计算。 状态转移方程:

状态转移方程是动态规划的核心部分,它定义了如何从一个状态转移到另一个状态。 在这段代码中,状态转移方程是 dp[i] = max(dp[i-1], dp[i-3] + a[i-1]),表示当前状态的值等于前一个状态的值和前三个状态的值加上当前元素的值中的较大者。 初始化:

动态规划需要对初始状态进行初始化,以便后续的状态转移能够顺利进行。 在这题中,dp[1] 被初始化为 a[0],dp[2] 被初始化为 max(a[0], a[1])。 边界条件处理:

动态规划需要考虑边界条件,以确保算法的正确性。 在这题中,通过初始化 dp[1] 和 dp[2] 来处理边界条件。 时间复杂度:

动态规划的时间复杂度通常是线性的,即 O(n),因为每个状态只计算一次。 在这题中,由于只有一个循环遍历 n 次,因此时间复杂度为 O(n)。 空间复杂度:

动态规划的空间复杂度取决于存储状态的数量。 在这题中,dp 数组的大小为 n+1,因此空间复杂度为 O(n)。 测试用例:

使用了一些测试用例来验证算法的正确性。 这些测试用例涵盖了不同的输入情况,确保算法在各种情况下都能正确运行。 总结来说,这题通过动态规划方法解决了一个特定问题,并展示了如何初始化、填充状态转移方程以及处理边界条件等关键步骤。