题目大意:有S种股票,已经知道每一天每一种股票的价格。一共有d天,一开始拥有的钱为m,求最后总共能够拥有多少钱
题解:看上去决策非常复杂,似乎需要枚举购买时间
实际上,只需要将第i天向第i+1天转移就可以了
因为第一天买第三天卖出=第一天买第二天卖,再用原价买回来,然后第三天卖出
做D-1次完全背包即可
我的收获:状态的转移……转移的方向……
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=55;
int S,D,M;
int mp[N][N];
int f[500005];
void work()
{
for(int i=1;i<D;i++){
memset(f,0,sizeof(f));//注意清空数组
for(int j=1;j<=S;j++){
int w=mp[i][j],v=mp[i+1][j];
for(int k=w;k<=M;k++)
f[k]=max(f[k],f[k-w]+v-w);
}
M+=f[M];
}
printf("%d\n",M);
}
void init()
{
cin>>S>>D>>M;
for(int i=1;i<=S;i++)
for(int j=1;j<=D;j++)
scanf("%d",&mp[j][i]);
}
int main()
{
init();
work();
return 0;
}