日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

P3195-[HNOI2008]玩具装箱【斜率优化dp】

發(fā)布時(shí)間:2023/12/3 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 P3195-[HNOI2008]玩具装箱【斜率优化dp】 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

正題

題目鏈接:https://www.luogu.com.cn/problem/P3195


題目大意

nnn個(gè)物品,分成若干段,每一段的長度為j?i+∑i=lrCkj-i+\sum_{i=l}^rC_kj?i+i=lr?Ck?,打包價(jià)格為(長度?L)2(長度-L)^2(?L)2

求最小價(jià)格和。


解題思路

si=∑j=1iCjs_i=\sum_{j=1}^iC_jsi?=j=1i?Cj?
設(shè)fif_ifi?表示iii前面的都打包完了,有
fi=fj+(si?sj+i?j?1?L)2f_i=f_j+(s_i-s_j+i-j-1-L)^2fi?=fj?+(si??sj?+i?j?1?L)2
fi=fj+(si+i?sj?j?1?L)2f_i=f_j+(s_i+i-s_j-j-1-L)^2fi?=fj?+(si?+i?sj??j?1?L)2
然后dpdpdp可以做到O(n2)O(n^2)O(n2),因?yàn)橛衅椒?#xff0c;考慮斜率優(yōu)化
定義ai=si+i,bi=sj+j+1+La_i=s_i+i,b_i=s_j+j+1+Lai?=si?+i,bi?=sj?+j+1+L

fi=fj+(ai?bj)2f_i=f_{j}+(a_i-b_j)^2fi?=fj?+(ai??bj?)2
fi=fj+ai2?2aibj+bj2f_i=f_j+a_i^2-2a_ib_j+b_j^2fi?=fj?+ai2??2ai?bj?+bj2?
2aibj+fi?ai2=fj+bj22a_ib_j+f_i-a_i^2=f_j+b_j^22ai?bj?+fi??ai2?=fj?+bj2?

對(duì)于每一個(gè)jjj表示一個(gè)點(diǎn)(bj,fj+bj2)(b_j,f_j+b_j^2)(bj?,fj?+bj2?)(后文中稱之為決策點(diǎn))

考慮如何使fif_ifi?最小,因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">ai2a_{i}^2ai2?是定值即讓fi?ai2f_{i}-a_{i}^2fi??ai2?最小,那么問題就變?yōu)榱艘粭ly=2aix+ky=2a_ix+ky=2ai?x+k的直線,要求經(jīng)過某個(gè)決策點(diǎn)使得kkk最小。

那么顯然,可能的點(diǎn)一定是一個(gè)下凸殼(相鄰的點(diǎn)斜率單調(diào)上升),而因?yàn)?span id="ozvdkddzhkzd" class="katex--inline">2ai2a_i2ai?這個(gè)斜率也是單調(diào)上升的,我們可以知道答案就是第一個(gè)決策點(diǎn)滿足與下一個(gè)決策點(diǎn)的斜率≥2ai\geq 2a_i2ai?

那么我們維護(hù)一個(gè)單調(diào)隊(duì)列即可。

時(shí)間復(fù)雜度O(n)O(n)O(n)


codecodecode

#include<cstdio> #include<cstring> #include<algorithm> #define pow2(x) ((x)*(x)) using namespace std; const int N=5e4+10; struct node{double x,y;int num; }q[N]; int n,head,tail,L; double s[N],a[N],b[N],f[N]; double slope(node x,node y) {return ((y.y-x.y)/(y.x-x.x));} int main() {scanf("%d%d",&n,&L);for(int i=1;i<=n;i++){scanf("%lf",&s[i]);s[i]+=s[i-1];a[i]=s[i]+i;b[i]=s[i]+i+L+1;}b[0]=L+1;head=tail=1;q[1]=(node){b[0],b[0]*b[0],0};for(int i=1;i<=n;i++){while(head<tail&&slope(q[head],q[head+1])<2*a[i])head++;int p=q[head].num;f[i]=f[p]+pow2(a[i]-b[p]);node w=(node){b[i],f[i]+b[i]*b[i],i};while(head<tail&&slope(w,q[tail-1])<slope(q[tail-1],q[tail]))tail--;q[++tail]=w;}printf("%.0lf",f[n]); }

總結(jié)

以上是生活随笔為你收集整理的P3195-[HNOI2008]玩具装箱【斜率优化dp】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。