《最少前缀操作问题》| 豆包MarsCode AI刷题

59 阅读2分钟

笔记:最少前缀操作问题

问题描述

QQ浏览器截图20241126122812.png

输入输出

  • 输入:三个参数,n 表示数组 data 的长度,k 表示每个步骤中可以选择的元素数量的上限,data 是包含成本的数组。
  • 输出:一个整数,表示在给定条件下的最小总成本。

算法设计

  1. 初始化动态规划表:创建一个 (n+1) x (k+1) 的二维数组 dp,所有值初始化为无穷大(float('inf')),dp[0][0] 初始化为0,表示在没有元素和没有选择的情况下成本为0。
  2. 填充动态规划表:使用三层循环遍历 dp 表,外层循环遍历 data 数组,中间循环遍历可能的选择数量 l,内层循环遍历上一步的选择数量 j
  3. 状态转移:对于每个 il,计算从 dp[i-1][j]dp[i][l] 的最小成本,条件是 l - j + 10k 之间,表示当前步骤可以选择的元素数量。
  4. 计算最小成本:更新 dp[i][l]dp[i-1][j] + (l - j + 1) * data[i-1] 的最小值。

代码实现

def solution(n, k, data):
    dp = [[float('inf')] * (k + 1) for _ in range(n + 1)]
    dp[0][0] = 0
    
    for i in range(1, n + 1):
        for l in range(k):
            for j in range(k):
                if l - j + 1 >= 0 and l - j + 1 <= k:
                    dp[i][l] = min(dp[i][l], dp[i - 1][j] + (l - j + 1) * data[i - 1])
    return dp[n][0]

测试样例

  • 测试样例1solution(5, 2, [1, 2, 3, 3, 2]) 返回 9
  • 测试样例2solution(6, 3, [4, 1, 5, 2, 1, 3]) 返回 9
  • 测试样例3solution(4, 1, [3, 2, 4, 1]) 返回 10

总结

这个算法通过动态规划的方法,有效地解决了在给定条件下最小化成本的问题。它的时间复杂度是 O(n * k^2),其中 n 是数组 data 的长度,k 是每个步骤中可以选择的元素数量的上限。