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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

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

? ? 斜率優化問題一般都是決策單調問題。對于這題能夠證明單調決策。

令sum[i]=sigma(c [k] ) 1<=k<=i ?, ?f[i]=sum[i]+i , ?c=L+1;

?首先我們能夠寫出轉移方程 ?dp[i] = min( dp[j] + (f[i]-f[j]-c)^2 ) ?。令決策j1<j2。若決策j2更優有

?dp[j2]+(f[i]-f[j2]-c)^2<=dp[j1]+(f[i]-f[j1]-c)^2

能夠得帶 ((dp[j2]+f[j2]^2)-(dp[j1]+f[j1]^2) ?)/(f[j2]-f[j1])<2*(f[i]-c)。

優于f[i]是遞增的,所以對于t>i的點。決策j2總是比j1更優。那么j1實際上能夠從決策集合中刪除。后面的就能夠用一個隊列維護了。



<span style="font-size:14px;">#include <set> #include <map> #include <queue> #include <stack> #include <cmath> #include <string> #include <cctype> #include <cstdio> #include <cstdlib> #include <cstring> #include <iomanip> #include <iostream> #include <algorithm> using namespace std; typedef long long LL; const int inf = 0x3fffffff; const int mmax =50010; LL C[mmax]; LL L,c; LL sum[mmax],f[mmax],dp[mmax]; LL sqr(LL x) {return x*x; } double G(int x) {return 1.0*f[x]*f[x]+dp[x]; } double S(int x) {return 2.0*f[x]; } void calc(int i,int j) {dp[i]=dp[j]+sqr(f[i]-f[j]-c); } int Q[mmax]; int main() {int n;while(cin>>n>>L){c=L+1;sum[0]=0;f[0]=0;for(int i=1;i<=n;i++){scanf("%lld",&C[i]);sum[i]=sum[i-1]+C[i];f[i]=sum[i]+i;}int head=0,tail=-1;dp[0]=0;Q[++tail]=0;for(int i=1;i<=n;i++){while(head<tail){double tmp=1.0*(G(Q[head+1])-G(Q[head]))/(S(Q[head+1])-S(Q[head]));if(tmp<=f[i]-c)head++;elsebreak;}calc(i,Q[head]);while(head<tail){double tmp1=1.0*(G(Q[tail])-G(Q[tail-1]))/(S(Q[tail])-S(Q[tail-1]));double tmp2=1.0*(G(i)-G(Q[tail]))/(S(i)-S(Q[tail]));if(tmp1>=tmp2)tail--;elsebreak;}Q[++tail]=i;}printf("%lld\n",dp[n]);}return 0; } </span>

轉載于:https://www.cnblogs.com/yangykaifa/p/6780636.html

總結

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

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