1. 程式人生 > >股票交易

股票交易

個人 style scan 至少 net include details max i+1

題目描述

最近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; }

股票交易