题目描述
尽管奶牛天生谨慎,它们仍然在住房抵押信贷市场中大受打击,现在它们准备在股市上碰碰运气。贝西有内部消息,她知道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 1010 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;
}