股票交易
題目描述
最近lxhgww又迷上了投資股票,通過一段時間的觀察和學習,他總結出了股票行情的一些規律。通過一段時間的觀察,lxhgww預測到了未來T天內某只股票的走勢,第i天的股票買入價為每股APi,第i天的股票賣出價為每股BPi(數據保證對于每個i,都有APi>=BPi),但是每天不能無限制地交易,于是股票交易所規定第i天的一次買入至多只能購買ASi股,一次賣出至多只能賣出BSi股。
另外,股票交易所還制定了兩個規定。為了避免大家瘋狂交易,股票交易所規定在兩次交易(某一天的買入或者賣出均算是一次交易)之間,至少要間隔W天,也就是說如果在第i天發生了交易,那么從第i+1天到第i+W天,均不能發生交易。同時,為了避免壟斷,股票交易所還規定在任何時間,一個人的手里的股票數不能超過MaxP。
在第1天之前,lxhgww手里有一大筆錢(可以認為錢的數目無限),但是沒有任何股票,當然,T天以后,lxhgww想要賺到最多的錢,聰明的程序員們,你們能幫助他嗎?
輸入
第一行包括3個整數,分別是T,MaxP,W。接下來T行,第i行代表第i-1天的股票走勢,每行4個整數,分別表示APi,BPi,ASi,BSi。
輸出
一行,包括1個數字,表示lxhgww能賺到的最多的錢數。樣例輸入
5 2 0 2 1 1 1 2 1 1 1 3 2 1 1 4 3 1 1 5 4 1 1樣例輸出
3提示
?
對于100%的數據,0<=W<T<=2000,1<=MaxP<=2000
對于所有的數據,1<=BPi<=APi<=1000,1<=ASi,BSi<=MaxP http://blog.csdn.net/whjpji/article/details/7292009 #include <bits/stdc++.h> using namespace std; int dp[2222][2222],money[2222],qu[2222]; int t,m,w,ap,bp,as,bs; void in(int i,int day) {int l=0,r=0;for(int j=0; j<=m; ++j){while(l<r&&qu[l]<j-as)l++;while(l<r&&dp[day][j]+j*ap>=money[r-1])r--;money[r]=dp[day][j]+ j * ap;qu[r++]=j;if (l < r)dp[i][j] = max(dp[i][j], money[l] - j * ap);} } void out(int i,int day) {int l=0,r=0;for(int j=m; j>=0; --j){while(l<r&&qu[l]>j+bs)l++;while(l<r&&dp[day][j]+j*bp>=money[r-1])r--;money[r]=dp[day][j]+ j * bp;qu[r++]=j;if (l < r)dp[i][j] = max(dp[i][j], money[l] - j * bp);} } int main() {int ans=0;scanf("%d%d%d",&t,&m,&w);memset(dp,0xc0,sizeof dp);dp[0][0]=0;for (int i = 1; i <=t; ++i){scanf("%d%d%d%d",&ap,&bp,&as,&bs);for (int j = 0; j <=as ; ++j)dp[i][j] = -ap * j;for (int j = 0; j <=m ; ++j)dp[i][j]=max(dp[i][j],dp[i-1][j]);int qian=i-w-1;if(qian>0){in(i,qian);out(i,qian);ans=max(ans,dp[i][0]);}}cout<<ans<<endl;return 0; }?
轉載于:https://www.cnblogs.com/qksy/p/8440307.html
總結
- 上一篇: windows8.1如何分盘
- 下一篇: lintcode:二叉树的层次遍历