AcWing 凸包优化DP相关问题 303. 运输小猫

from collections import deque

N, M, P = map(int, input().split())
dis = [0, 0] + list(map(int, input().split()))

for i in range(1, len(dis)):
    dis[i] += dis[i-1]

A = []
for i in range(M):
    h, t = map(int, input().split())
    A.append(t - dis[h])
A.sort()
S = [val for val in A]
for i in range(1, M):
    S[i] += S[i-1]

'''
dp(i, j) 表示前j只猫i个饲养员送的最小开销,等价于把A前j个数分成最多i组,最小的总开销

dp(i, j) = min {
    (j-k)*A[j] - [S(j) - S(k)] + dp(i-1, k)
}

k = j-1, j-2, ......0, -1 (k = -1时候特殊处理,dp[i][k] = 0

两层循环,每一行迭代时候就是一轮一维的凸包优化DP


S[k] + dp(i-1, k) = A[j] * k + ( S(j) - j*A[j] + dp(i, j) )
看做关于k的直线,横轴是k, 纵轴是S[k] + dp(i-1, k) 

'''

dp = [[0] * (M+1) for _ in range(P+1)]

for i in range(1, P+1):

    if i == 1:
        for j in range(M):
            dp[i][j] = A[j] * (j + 1) - S[j]

    els
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值