[BZOJ1010][HNOI2008]玩具装箱toy(斜率优化dp)

来源:互联网 发布:java实现排序算法 编辑:程序博客网 时间:2024/04/28 18:56

题目描述

传送门

题解

题目描述认真读
转移方程:f(i)=min{f(j)+(ij1+sisjL)2}
刚开始上来就化然后发现不可做。
考虑换元 令pi=si+i,L=L+1
f(i)=min{f(j)+(pipjL)2}
然后展开
f(i)=min{2pjpi+f(j)+p2j+2pjL}+p2i+L22piL
k=2pj,b=f(j)+p2j+2pjL
明显可以用斜率优化。

这道题启示我们:一定要把ij相关的放在一起!

代码

#include<iostream>#include<cstring>#include<cstdio>using namespace std;#define LL long longconst int max_n=5e4+5;LL n,L,x;LL s[max_n],p[max_n];LL q[max_n],head,tail;LL f[max_n];inline LL K(LL j){return -2*p[j];}inline LL B(LL j){return f[j]+p[j]*p[j]+2*L*p[j];}inline LL Y(LL i,LL j){return K(j)*p[i]+B(j);}inline bool cmp(LL x1,LL x2,LL x3){    LL w1=(K(x1)-K(x3))*(B(x2)-B(x1));    LL w2=(K(x1)-K(x2))*(B(x3)-B(x1));    return w1>=w2;}int main(){    scanf("%lld%lld",&n,&L);    for (LL i=1;i<=n;++i) scanf("%lld",&x),s[i]=s[i-1]+x,p[i]=s[i]+i; L++;    head=tail=0;    for (LL i=1;i<=n;++i){        while (head<tail&&Y(i,q[head])>=Y(i,q[head+1])) head++;        f[i]=Y(i,q[head])+p[i]*p[i]-2*L*p[i]+L*L;        while (head<tail&&cmp(i,q[tail-1],q[tail])) tail--;        q[++tail]=i;    }    printf("%lld\n",f[n]);}

总结

强转注意中间爆int

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 长寿花叶尖焦了怎么办 新买的盆栽蔫了怎么办 熬中药水太多了怎么办 秋根海棠烂根怎么办 大叶海棠烂根怎么办 玻璃海棠长得很高怎么办 玫瑰海棠叶子干焦怎么办 海棠树树干生虫怎么办 天竺葵花骨朵有虫子了怎么办? 被刺梅的刺扎了怎么办 被刺梅的刺划手了怎么办 虎刺花叶子黄了怎么办 地栽月季叶子发黄怎么办 梅花浇水浇多了怎么办 深水井底下花管进水量小怎么办 盆景对节白腊树叶尖干枯怎么办 四季海棠茎软了怎么办 玫瑰海棠烂根了怎么办 格丽海棠花腌了怎么办 养殖场不能雨污分流怎么办 药店买的药贵了怎么办 神经损伤小便少尿不出来怎么办 手指夹伤出血了怎么办 手指夹破流血了怎么办 喂了宝宝熊胆粉怎么办 不小心擦伤了皮怎么办 吃了减肥药拉肚子怎么办 遇到他心通的人怎么办 被茅山术害了怎么办 鱼缸鱼身上烂了怎么办 鳄鱼龟皮肤烂了怎么办 墨水渗透进皮肤里了怎么办 中药渗透到皮肤里怎么办 甘露醇渗透到皮肤下怎么办 水银弄到眼睛里怎么办 水银粘到皮肤上怎么办 榴莲和虾同吃了怎么办 吃榴莲和虾中毒怎么办 榴莲和虾一起吃怎么办 狗被别人下毒了怎么办 大掌门2没存元宝怎么办