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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

SCOI2010 股票交易

發布時間:2025/3/14 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SCOI2010 股票交易 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目鏈接:戳我

看到這個題目,我們有一個樸素的DP想法(但是為什么我會先想到網絡流啊喂,果然是菜雞)

\(dp[i][j][0/1/2]\)表示第i天不進行交易/買入/賣出,現在手上有j張票,前i天能夠獲得的最大收益。轉移什么的隨便弄弄就行了吧。

然后發現自己智障了,0/1/2根本不用劃分好嗎.......于是就變成了這個樣子......\(dp[i][j]\)表示現在手上有j張票,前i天能夠獲得的最大收益。

\(dp[i][j]=max(dp[i][j],dp[i-1][j])\)
\(dp[i][j]=max(dp[i][j],dp[i-w-1][k]-ap[i]*(j-k))\)
\(dp[i][j]=max(dp[i][j],dp[i-w-1][k]+bp[i]*(k-j))\)

于是50分到手。

#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #define MAXN 2010 using namespace std; int n,m,w; int ap[MAXN],bp[MAXN],as[MAXN],bs[MAXN]; long long dp[MAXN][MAXN]; int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifscanf("%d%d%d",&n,&m,&w);for(int i=1;i<=n;i++)scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)dp[i][j]=-0x3f3f3f3f3f3f3f3f;dp[0][0]=0;for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){dp[i][j]=max(dp[i][j],dp[i-1][j]);for(int k=max(0,j-as[i]);k<=j-1;k++){int cur=max(0,i-w-1);dp[i][j]=max(dp[i][j],dp[cur][k]-1ll*ap[i]*(j-k));}for(int k=j+1;k<=m&&k<=j+bs[i];k++){int cur=max(0,i-w-1);dp[i][j]=max(dp[i][j],dp[cur][k]+1ll*bp[i]*(k-j));}}}long long ans=0;for(int i=0;i<=m;i++) ans=max(ans,dp[n][i]);printf("%lld\n",ans);return 0; }

之后我們考慮一下怎么把這個K給去掉。
把轉移方程化一下:
\(dp[i][j]=max(dp[i-1][j])\)
\(dp[i][j]=max(dp[i-w-1][k]+k*ap[i])-ap[i]*j (j-as[i]\le k \le j-1)\)
\(dp[i][j]=max(dp[i-w-1][k]+k*bp[i])+bp[i]*j (j+1\le k\le j+bs[i])\)

我們發現那個取max的部分是可以用單調隊列優化的.......
于是就100pts了

#include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstring> #include<queue> #define MAXN 2010 using namespace std; int n,m,w; int ap[MAXN],bp[MAXN],as[MAXN],bs[MAXN],q[MAXN]; long long dp[MAXN][MAXN]; int main() {#ifndef ONLINE_JUDGEfreopen("ce.in","r",stdin);#endifscanf("%d%d%d",&n,&m,&w);for(int i=1;i<=n;i++)scanf("%d%d%d%d",&ap[i],&bp[i],&as[i],&bs[i]);for(int i=0;i<=n;i++)for(int j=0;j<=m;j++)dp[i][j]=-0x3f3f3f3f3f3f3f3f;for(int i=1;i<=n;i++) dp[i][0]=0;for(int i=1;i<=n;i++){for(int j=0;j<=as[i];j++) dp[i][j]=-ap[i]*j;for(int j=0;j<=m;j++) dp[i][j]=max(dp[i][j],dp[i-1][j]);if(i-w-1>=0){int head=1,tail=0;for(int j=0;j<=m;j++){while(head<=tail&&q[head]<j-as[i]) head++;while(head<=tail&&dp[i-w-1][j]+ap[i]*j>=dp[i-w-1][q[tail]]+ap[i]*q[tail]) tail--;q[++tail]=j;dp[i][j]=max(dp[i][j],dp[i-w-1][q[head]]-ap[i]*(j-q[head]));}head=1,tail=0;for(int j=m;j>=0;j--){while(head<=tail&&q[head]>j+bs[i]) head++;while(head<=tail&&dp[i-w-1][j]+j*bp[i]>=dp[i-w-1][q[tail]]+q[tail]*bp[i]) tail--;q[++tail]=j;dp[i][j]=max(dp[i][j],dp[i-w-1][q[head]]+bp[i]*(q[head]-j));}}}long long ans=0;for(int i=0;i<=m;i++) ans=max(ans,dp[n][i]);printf("%lld\n",ans);return 0; }

轉載于:https://www.cnblogs.com/fengxunling/p/10888289.html

總結

以上是生活随笔為你收集整理的SCOI2010 股票交易的全部內容,希望文章能夠幫你解決所遇到的問題。

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