📌  相关文章
📜  最多 K 次跳跃的给定数组中的最大路径和(1)

📅  最后修改于: 2023-12-03 15:40:13.888000             🧑  作者: Mango

最多 K 次跳跃的给定数组中的最大路径和

问题描述

给定一个整数数组 nums,以及一个整数 k,从数组的任意起始索引开始,最多允许跳 k 次,每次跳跃必须移动至相邻的元素,求所有可能的跳跃方案中,路径和的最大值。

解题思路

本题可以使用动态规划求解。

定义一个二维数组 dp,其中 dp[i][j] 表示从索引 i 开始最多可以跳 j 次的情况下能得到的最大路径和。注意,由于本题要求从任意起始位置开始跳跃,因此需要对数组的所有位置进行遍历,并将每个位置作为起始位置。

状态转移方程为:

dp[i][j] = max(dp[i][j], dp[x][j-1] + nums[i])

其中 x 为 i 前面的所有位置,满足 i - x <= k。

最大路径和即为 dp 数组中的所有元素的最大值。

代码实现
def max_path_sum(nums: List[int], k: int) -> int:
    n = len(nums)
    dp = [[float('-inf')] * (k + 1) for _ in range(n)]
    
    # 初始化,从 i 开始跳 0 次只能到达自身,路径和即为 nums[i]
    for i in range(n):
        dp[i][0] = nums[i]
    
    # 状态转移
    for j in range(1, k + 1):
        for i in range(n):
            for x in range(max(0, i - k), i):
                dp[i][j] = max(dp[i][j], dp[x][j-1] + nums[i])
    
    # 返回最大路径和
    return max([max(row) for row in dp])

复杂度分析:

  • 时间复杂度:O(n^2 * k),其中 n 为数组长度。
  • 空间复杂度:O(nk)。