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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

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

正題

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


題目大意

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

求最小價格和。


解題思路

si=∑j=1iCjs_i=\sum_{j=1}^iC_jsi?=j=1i?Cj?
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),因為有平方,考慮斜率優化
定義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?

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

考慮如何使fif_ifi?最小,因為ai2a_{i}^2ai2?是定值即讓fi?ai2f_{i}-a_{i}^2fi??ai2?最小,那么問題就變為了一條y=2aix+ky=2a_ix+ky=2ai?x+k的直線,要求經過某個決策點使得kkk最小。

那么顯然,可能的點一定是一個下凸殼(相鄰的點斜率單調上升),而因為2ai2a_i2ai?這個斜率也是單調上升的,我們可以知道答案就是第一個決策點滿足與下一個決策點的斜率≥2ai\geq 2a_i2ai?

那么我們維護一個單調隊列即可。

時間復雜度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]); }

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。