【BZOJ 5311】贞鱼

这篇博客介绍了如何解决一个关于贞鱼的数学问题,其中贞鱼之间的怨气值需要最小化。文章讨论了如何通过二维前缀和构建动态规划解决方案,并探讨了如何通过决策单调性和凸优化来降低复杂度,最终实现O(n log n log Max)的时间复杂度。博主分享了问题的解决思路和代码实现。

题目链接

题目描述

众所周知,贞鱼是一种高智商水生动物。不过他们到了陆地上智商会减半。
这不?他们遇到了大麻烦!
n只贞鱼到陆地上乘车,现在有k辆汽车可以租用。
由于贞鱼们并不能在陆地上自由行走,一辆车只能载一段连续的贞鱼。
贞鱼们互相有着深深的怨念,每一对贞鱼之间有怨气值。
第i只贞鱼与第j只贞鱼的怨气值记为Yij,且Yij=Yji,Yii=0。
每辆车载重不限,但是每一对在同辆车中的贞鱼都会产生怨气值。
当然,超级贞鱼zzp长者希望怨气值的总和最小。
不过他智商已经减半,想不出分配方案。
他现在找到了你,请你帮助他分配贞鱼们,并输出最小怨气值之和ans。

Sol

由于只能选择一段连续的鱼为一组,我们很容易用二维前缀和得出一个区间内怒气值的和,于是有一个简单的dp。
f [ i ] [ j ] f[i][j] f[i][j] 表示到了 i i i ,已经选了 j j j 组的最优答案,直接做复杂度为 O ( n 2 k ) O(n^2k) O(n2k)
考虑优化,我们要做的是一个前缀取 m i n min min 的操作,但是每次的贡献随着 i i i的移动而发生变化,不好用数据结构维护
不过我们很容易发现决策具有单调性,即如果 j > k j>k j>k j j j的转移在 i i i 处已经优于了 k k k,那么 k k k就没有用了,后面的转移 j j j 总比 k k k 优,证明很简单,因为当前 [ j , i ] [j,i] [j,i]区间包含的怒气肯定是 [ k , i ] [k,i] [k,i]的一个子集,而此时 j j j 的转移已经优于 k k k 了,说明了无论是本身的 dp 值还是而外可能增加的怒气值 j j j 都会优于 k k k ,显然 k k k是没有用的,这样的话使用决策单调性优化,复杂度降为 O ( n k l o g n ) O(nklogn) O(nklogn),依然过不去

再来发现一波性质
假设我们现在是拿着 k-1 块板子来分开 这些鱼,那么显然如果贪心选取的话我们第一块板子下去能够减少的怒气值必然多于第二块板子下去时减少的怒气值,也就是说 k k k 越大,答案减少的速度越慢,那么就证明了这是个凸函数,于是凸优化一波,就没了。复杂度

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值