您的位置:首页 > Web前端

【USACO】2009 Feb Stock Market 股票市场

2016-11-08 08:56 218 查看

Stock Market 股票市场

Description

尽管奶牛们天生谨慎,她们仍然在住房抵押信贷市场中大受打击,现在她们准备在股市 上碰碰运气。贝西开挂了,她知道S只股票在今后D天内的价格。

假设她一开始有M元钱,怎么操作才能在D天后赚到最多的钱?股票在市场上的供应量 可以看成是无限的,但买卖股票必须以整数为最小交易单位。

举一个牛市的例子。假设贝西有10元本金,股票价格如下:

股票 今天的单价 明天的单价 后天的单价

A 10 15 15

B 13 11 20

最赚钱的做法是:今天买入A股1张,到明天把它卖掉并且买入B股1张,然后在后天卖掉B股,此时贝西手上会有24元。

Input Format

第一行:三个用空格分开的整数:S,D和M,2≤S≤50,2≤D≤10,1≤M≤200000

第二行到第S+1行:第s+1行表示第s种股票在第1 天到第D天的售价,1≤售价≤1000

Output Format

第一行:D天后能赚的最多钱数,保证这个数字不超过500000

Sample Input

2 3 10

10 15 15

13 11 20

Sample Output

24

分析

一个O(SDM) 的动规,本以为过不了的,然而实际上卡卡还是能过。

分析一下题目发现,虽说可以间隔好几天再卖股票,但我们可以把中间不买不卖的看作买了又卖,这样动规方程就只要从前一天转移过来即可。

F[i]表示手中有购买价为i元的股票(可能是今天买的,也可能是之前买的),在明天把这些卖出去再加上现金最多为多少。(有点绕,详见动规方程)

#include <queue>
#include <stack>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int S,D,M,A[51][11],F[500001];
int main(){
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
scanf("%d%d%d",&S,&D,&M);
for (int i=1;i<=S;i++)
for (int j=1;j<=D;j++) scanf("%d",&A[i][j]);
for (int i=1;i<=D-1;i++){
F[0]=M,M=0;
for (int j=0;j<=F[0];j++){
for (int k=1;k<=S;k++){
if (j-A[k][i]>=0 && F[j-A[k][i]]-A[k][i]+A[k][i+1]>F[j])
F[j]=F[j-A[k][i]]-A[k][i]+A[k][i+1];
}
if (M<F[j]) M=F[j];
}
}
printf("%d",M);
fclose(stdin); fclose(stdout);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: