【贪心DP】gym100340A

Cookies

题目描述-点我跳转

你有 m \mathtt{m} m个礼物全部分给 n \mathtt{n} n个小朋友,第 i \mathtt{i} i小朋友的伤害值为 ∑ j = 1 n a i × g i \mathtt{\sum^{n}_{j=1}a_i \times g_i} j=1nai×gi,其中 a i \mathtt{a_i} ai, g i \mathtt{g_i} gi值第 i \mathtt{i} i个小朋友的比他礼物多的人数与一个给定值,求最后每个小朋友伤害值和最小值与其中一种 a i \mathtt{a_i} ai的方案

数据范围

1 ≤ n ≤ 30 , m ≤ 5 × 1 0 3 , g i ≤ 1 0 7 \mathtt{1 \le n \le 30 , m \le 5 \times 10^3 , g_i \le 10^7} 1n30,m5×103,gi107

这道题两个人比较只可能是礼物数一样或有人个人羡慕另一个人,那我们就会希望那个羡慕别人的人 g i \mathtt{g_i} gi要小,这样子总伤害才会小;当然我们也希望他们个数可以一样,这时后你会发现因为礼物要发完,所以个数之间会互相干预,这时候要使用dp,当然我们可以先对人的 g i \mathtt{g_i} gi排序,方便我们贪心


解法-贪心DP

d p i , j \mathtt{dp_{i,j}} dpi,j表示前 i \mathtt{i} i个人中分 j \mathtt{j} j个礼物的最小伤害
转移方程 d p i , j = m i n ( d p i , j , d p i − k , j − k + ( g i − k + 1 + ⋯ + g i ) ∗ ( i − k ) ) ( k ∈ { j ∣ j ∈ N + , j ≤ i } ) \mathtt{dp_{i,j}=min(dp_{i,j},dp_{i-k,j-k}+(g_{i-k+1}+\dots+g_{i})*(i-k))(k \in \{j|j \in N^+,j\le i\})} dpi,j=min(dpi,j,dpik,jk+(gik+1++gi)(ik))(k{jjN+,ji})
如果当前孩子前面(包括自己)有 k \mathtt{k} k个孩子拿到了 1 \mathtt{1} 1个,那他们会被把那些多于一个的人,即 i − k \mathtt{i-k} ik人伤害到,此时我们希望这些被伤害到的孩子 g i \mathtt{g_i} gi最小,所以排完序以后是连续的,就可以用前缀和,这里就解释完了 ( g i − k + 1 + ⋯ + g i ) ∗ ( i − k ) \mathtt{(g_{i-k+1}+\dots+g_{i})*(i-k)} (gik+1++gi)(ik)
这里 g i − k + 1 + ⋯ + g i \mathtt{g_{i-k+1}+\dots+g_{i}} gik+1++gi可以使用前缀和

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值