【DP】KC的瓷器(porcelain)
发布日期:2021-05-07 22:46:27 浏览次数:28 分类:精选文章

本文共 1838 字,大约阅读时间需要 6 分钟。

为了解决这个问题,我们需要找到一种方法来最大化从n排柜子中取出m个瓷器的总价值。每次只能从一排中取出最左边或最右边的瓷器。我们可以使用动态规划结合预处理来解决这个问题。

方法思路

  • 预处理每一排的最大价值:对于每一排,我们计算前缀和和后缀和,然后预处理每一排取k个瓷器的最大价值。
  • 动态规划:使用一个二维数组dp,其中dp[i][j]表示在处理了i排,取了j个瓷器的情况下,取得的最大价值。通过逐步更新dp数组,我们可以找到最优解。
  • 解决代码

    import sys
    def main():
    n, m = map(int, sys.stdin.readline().split())
    t = [0] * (n + 1) # t[i]表示第i排的总瓷器数
    a = [ [0]*(100 + 1) for _ in range(n + 1)] # a[i][j]表示第i排取j个瓷器的最大总价值
    for i in range(1, n+1):
    s = int(sys.stdin.readline())
    values = list(map(int, sys.stdin.readline().split()))
    t[i] = s
    pre_sum = [0] * (s + 1)
    suf_sum = [0] * (s + 1)
    for j in range(1, s+1):
    pre_sum[j] = pre_sum[j-1] + values[j-1]
    for j in range(1, s+1):
    suf_sum[j] = suf_sum[j-1] + values[s - j]
    # 计算qu[i][k]:取k个瓷器的最大价值
    qu = [0] * (s + 1)
    for k in range(0, s + 1):
    max_val = 0
    for p in range(0, k + 1):
    if p > s or (k - p) > s:
    continue
    current = pre_sum[p] + (suf_sum[k - p] - pre_sum[s - (k - p)])
    if current > max_val:
    max_val = current
    # 比较pre_sum[k]和suf_sum[k]
    max_val = max(max_val, pre_sum[k], suf_sum[k])
    qu[k] = max_val
    a[i] = qu
    # 初始化动态规划数组
    dp = [ [0]*(m+1) for _ in range(n+1)]
    for i in range(1, n+1):
    for j in range(0, m+1):
    for k in range(0, min(t[i], j) + 1):
    if j - k >= 0:
    if dp[i-1][j - k] + a[i][k] > dp[i][j]:
    dp[i][j] = dp[i-1][j - k] + a[i][k]
    print(dp[n][m])
    if __name__ == "__main__":
    main()

    代码解释

  • 读取输入:读取n和m的值,然后读取每一排的瓷器数量及其价值。
  • 预处理每一排:计算每一排的前缀和和后缀和,然后预处理每一排取k个瓷器的最大价值。
  • 动态规划:使用二维数组dp来记录取i排j个瓷器的最大价值,逐步更新dp数组,找到最优解。
  • 通过这种方法,我们可以在合理的时间内找到最大价值的解决方案。

    上一篇:【DFS】【暴力】【最小正环】开心小屋(smile)
    下一篇:【DFS】【暴力】KC看星(star)

    发表评论

    最新留言

    网站不错 人气很旺了 加油
    [***.192.178.218]2025年04月11日 19时33分05秒