[USACO 2009 Feb] 股票市场

本文介绍了一种利用动态规划解决股市买卖问题的方法,通过分析股价波动,制定最佳买卖策略以实现最大收益。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

尽管奶牛天生谨慎,它们仍然在住房抵押信贷市场中大受打击,现在它们准备在股市上碰碰运气。贝西有内部消息,她知道S只股票在今后D天内的价格。假设在一开始,她筹集了M元钱,那么她该怎样操作才能赚到最多的钱呢?贝西在每天可以买卖多只股票,也可以多次买卖同一只股票,交易单位必须是整数,数量不限。
举一个牛市的例子。假设贝西有10元本金,股票价格如下:
股票 今天的价格 明天的价格 后天的价格
A 10 15 15
B 13 11 20
最赚钱的做法是:今天买入 A 股 1 张,到明天把它卖掉并且买入 B 股 1 张,在后天卖掉 B 股,这样贝西就有24元了。

输入格式

第一行:三个整数:S,D和M,2 ≤ S ≤ 50,2 ≤ D ≤ 10,1 ≤ M ≤ 200000
第二行到第S + 1行:第i + 1行有D个整数:P(i,1)到P(i,D),表示第i种股票在第 1 天到第D天的售价,1 ≤ P(i,j)≤ 1000

输出格式

单个整数:表示奶牛可以获得的最大钱数,保证答案不超过500000

样例输入

2 3 10
10 15 15
13 11 20

样例输出

24

题目分析

如果这题想成了贪心,那你就跪了。

这题可以用动规做,为什么没有后效性呢?

因为昨天的股票明天卖就相当于今天卖了再买回来

接下来就可以当做完全背包做了。

源代码

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdlib>
#include<vector>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
inline const int Get_Int() {
	int num=0,bj=1;
	char x=getchar();
	while(x<'0'||x>'9') {
		if(x=='-')bj=-1;
		x=getchar();
	}
	while(x>='0'&&x<='9') {
		num=num*10+x-'0';
		x=getchar();
	}
	return num*bj;
}
int n,m,Shares[105][105],Money,f[500005];
int main() {
	n=Get_Int();
	m=Get_Int();
	Money=Get_Int();
    for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++)
            Shares[i][j]=Get_Int();
    for(int i=2; i<=m; i++) {
        memset(f,0,sizeof(f));
        for(int j=1; j<=n; j++)
            for(int k=Shares[j][i-1]; k<=Money; k++)
                f[k]=max(f[k],f[k-Shares[j][i-1]]+Shares[j][i]-Shares[j][i-1]); 
        Money+=f[Money];
    }
    printf("%d\n",Money);
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值