股票交易
題目描述
最近lxhgww又迷上了投資股票,通過(guò)一段時(shí)間的觀(guān)察和學(xué)習(xí),他總結(jié)出了股票行情的一些規(guī)律。通過(guò)一段時(shí)間的觀(guān)察,lxhgww預(yù)測(cè)到了未來(lái)T天內(nèi)某只股票的走勢(shì),第i天的股票買(mǎi)入價(jià)為每股APi,第i天的股票賣(mài)出價(jià)為每股BPi(數(shù)據(jù)保證對(duì)于每個(gè)i,都有APi>=BPi),但是每天不能無(wú)限制地交易,于是股票交易所規(guī)定第i天的一次買(mǎi)入至多只能購(gòu)買(mǎi)ASi股,一次賣(mài)出至多只能賣(mài)出BSi股。
另外,股票交易所還制定了兩個(gè)規(guī)定。為了避免大家瘋狂交易,股票交易所規(guī)定在兩次交易(某一天的買(mǎi)入或者賣(mài)出均算是一次交易)之間,至少要間隔W天,也就是說(shuō)如果在第i天發(fā)生了交易,那么從第i+1天到第i+W天,均不能發(fā)生交易。同時(shí),為了避免壟斷,股票交易所還規(guī)定在任何時(shí)間,一個(gè)人的手里的股票數(shù)不能超過(guò)MaxP。
在第1天之前,lxhgww手里有一大筆錢(qián)(可以認(rèn)為錢(qián)的數(shù)目無(wú)限),但是沒(méi)有任何股票,當(dāng)然,T天以后,lxhgww想要賺到最多的錢(qián),聰明的程序員們,你們能幫助他嗎?
輸入
第一行包括3個(gè)整數(shù),分別是T,MaxP,W。接下來(lái)T行,第i行代表第i-1天的股票走勢(shì),每行4個(gè)整數(shù),分別表示APi,BPi,ASi,BSi。
輸出
一行,包括1個(gè)數(shù)字,表示lxhgww能賺到的最多的錢(qián)數(shù)。樣例輸入
5 2 0 2 1 1 1 2 1 1 1 3 2 1 1 4 3 1 1 5 4 1 1樣例輸出
3提示
?
對(duì)于100%的數(shù)據(jù),0<=W<T<=2000,1<=MaxP<=2000
對(duì)于所有的數(shù)據(jù),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; }?
轉(zhuǎn)載于:https://www.cnblogs.com/qksy/p/8440307.html
總結(jié)
- 上一篇: windows8.1如何分盘
- 下一篇: lintcode:二叉树的层次遍历