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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

[DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料

發(fā)布時間:2023/12/13 编程问答 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

首先我想吐槽的是題目并沒有表明數據范圍。。。

?

這個題目 DP方程并不難表示。

dp[i][j]表示前i個地點攜帶了j個貨物的最小花費

dp[i][j] = dp[i-1][k] + (j-k) * cost + j*j*(leng[i]-leng[i-1])

如果你這樣直接提交上去,恭喜你超時!!! 因為這個時間復雜度是 O(n*k^2)

所以我們需要優(yōu)化一下,可以發(fā)現式子可以化簡為:

dp[i][j] = dp[i-1][k] - k * cost? + j*j*(leng[i]-leng[i-1]) +??j*cost?

dp[i][j] = dp[i-1][k] - k * cost 這一部分可以只是與k有關,這里我們可以用單調隊列進行優(yōu)化,使其保持 最小值。

?

坑點1:注意數據范圍

坑點2:注意初始化

?

/**************************************************************Problem: 2059User: LYFerLanguage: C++Result: AcceptedTime:480 msMemory:61600 kb ****************************************************************/#include <stdio.h> #include <string.h> #include <algorithm> #include <queue>#define mp(a,b) make_pair(a,b) #define fr(a,b,c) for(int c=a;c<=b;++c)using namespace std; typedef long long ll;const ll INF = 1e16; ll dp[777][10005]; int n,e,k;inline int Read(){int ans = 0, flag = 1;char ch = getchar();while(ch < '0' || ch > '9'){if(ch=='-') flag=-1;ch = getchar();}while(ch >= '0' && ch <= '9'){ans = ans * 10 + ch - '0';ch = getchar();}return ans * flag; }struct task{ll now,num,cost;bool operator <(const task &x) const{return now < x.now;} }feed[505];struct DanDiao{deque< pair<ll,int> >Q;void insert(ll x,int y){while( !Q.empty() && Q.back().first >= x) Q.pop_back();Q.push_back( mp(x,y) );}void erase(int y){while( !Q.empty() && Q.front().second <= y) Q.pop_front();} }DD;int main(){k = Read();e = Read();n = Read();fr(1,n,i){feed[i].now = Read();feed[i].num = Read();feed[i].cost = Read();}sort(feed+1,feed+1+n);feed[++n] = (task){e,0,0};for(int i=0;i<=n;i++){for(int j=0;j<=k;j++){dp[i][j] = INF;}}dp[1][0] = 0;fr(2,n,i){DD.Q.clear();int r = 0;fr(0,k,j){while(r <= j) DD.insert(dp[i-1][r] - r*feed[i-1].cost , r) , r++;DD.erase(j - feed[i-1].num - 1);if( DD.Q.empty()) dp[i][j] = INF;else dp[i][j] = DD.Q.front().first+j*feed[i-1].cost+j*j*(feed[i].now-feed[i-1].now);}}/*for(int i=1;i<=n;i++){for(int j=0;j<=k;j++){printf("dp[%d][%d]:%d\n",i,j,dp[i][j]);}}*/printf("%lld\n",dp[n][k]);return 0; } AC代碼

?

轉載于:https://www.cnblogs.com/OIerLYF/p/7601218.html

總結

以上是生活随笔為你收集整理的[DP/单调队列]BZOJ 2059 [Usaco2010 Nov]Buying Feed 购买饲料的全部內容,希望文章能夠幫你解決所遇到的問題。

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