斜率大法题库
2015-08-23 13:52
309 查看
[bzoj3675][Apio2014]序列分割
题目大意及模型转换
给定一个由N个元素组成的序列,你现在要对其做M次操作。每次操作如下:1、选择一个长度大于1的序列,找到任意一个合法位置,将其分割成两个长度不为0的序列。
如[3,2,5,7,8]可以在2后面进行分割变为[3,2]和[5,7,8]。
2、如此做可以获得分数为两个分割后的序列元素之和相乘。
请使总分数最大。
每个元素都为正数,n<=100000,k<=min(n-1,200)。
DP做法
我们应该意识到切的先后顺序是没有用的。设f[i,k]表示前i个元素被分割了k次,获得的最大总分。
设sum[i]表示1到i元素的前缀和。
显然f[i,k]=max(f[j,k−1]+sum[j]∗(sum[i]−sum[j]))
这个DP可以在O(N2∗M)的复杂度内完成。
斜率大法好
我们可以固定一个k,然后看看是否可以进行斜率优化。固定k后我们固定一个i,然后比较决策j优于决策l的条件。
f[j,k−1]+sum[j]∗sum[i]−sum[j]2>f[l,k−1]+sum[l]∗sum[i]−sum[l]2
f[j,k−1]−f[l,k−1]+sum[l]2−sum[j]2>sum[i]∗(sum[l]−sum[j])
f[j,k−1]−f[l,k−1]+sum[l]2−sum[j]2sum[l]−sum[j]>sum[i]
那么我们左边与i无关。
每个元素都是正数,右边的sum[i]会递增。
为了保证sum[l]-sum[j]>0,因此要保证j<l。
我们开单调队列。
那么新加入的放队尾,最优的取队头。
对于固定的k。
设g(j,l)=f[j,k−1]−f[l,k−1]+sum[l]2−sum[j]2sum[l]−sum[j]
那么单调队列内需保证相邻三元素,前两个的g值小于后两个的g值。
复杂度O(NM)。
[火影完结纪念赛]木叶的军师
题目大意及模型转换
给定N个正整数,要求分成M组。每组带来的价值为这组的最大值与最小值差的平方。请使总价值最小。n<=10000,m<=5000。DP做法
可以贪心的得知,排个序以后,连续的分成一组一定最优。设f[i,k]表示前i个数分成k组最小总价值。
则f[i,k]=min(f[j,k−1]+(a[i]−a[j+1])2)
斜率大法好
同第一题,固定k与i,那么j和l哪个优呢?设j优于l,需满足:
f[j,k−1]+(a[i]−a[j+1])2<f[l,k−1]+(a[i]−a[l+1])2
f[j,k−1]−f[l,k−1]+a[j+1]2−a[l+1]2<2∗a[i]∗(a[j+1]−a[l+1])
f[j,k−1]−f[l,k−1]+a[j+1]2−a[l+1]2a[j+1]−a[l+1]>2∗a[i]
注意为什么变号。
因为我们要j<l。排序后a[j+1]-a[l+1]<=0。
对于等于0的情况,我们进行合并(容易得知合并后不会造成什么影响,因为相同的一定分在同一组)。
那么小于0,两端相除一个负数,自然要进行变号。
待补充
相关文章推荐
- POJ 1064 && HDU 1551 Cable master(二分)
- hdu 1176 免费馅饼
- IOS开发中设置控件内容对齐方式时容易混淆的几个属性
- Python抓取网页数据 生成 iOS plist 文件
- Java 操作集合的工具类:Collections
- 第三节:springmvc+hibernate+spring整合实例
- server启动故障处理 com.ibm.ws.exception.RuntimeError
- UIButton
- Struts2学习(五)访问web元素总结
- POJ 1050 && HDU 1081 To the Max(前缀和)
- python中两个整数相除得到浮点数的方法
- spark core源码分析1 集群启动及任务提交过程
- hdu 1231 最大连续子序列
- servlet第2讲(下集)----创建servlet实例(继承GenericServlet)
- python连接,操作pgsql
- sql server 调优要点
- POJ 1046 Color Me Less(水~)
- maven中 Could not create local repository问题原因及解决方法
- BZOJ3038 && BZOJ3211 上帝造题的七分钟2 && 花神游历各国 (线段树 + 开方标记)
- 抓取百度搜索结果