P2938 [USACO09FEB] Stock Market G
题解
1.每一天只有二种决策,第一是不买,第二是当天买过几天抛
第二种决策等价于当天买入第二天抛,原理如下
对于一只股票,我们在第 \(i\) 天买第 \(j\) 天卖,其效果可以被看为在第 \(i\) 天买,第 \(k\) 天卖 \((𝑖≤𝑘≤𝑗)\),当天再买回来,第 \(j\) 天卖。
2.要使赚钱最多,等价于赚的钱大于花的钱,因此,可以把花出去的钱看成体积,能赚多少钱看成价值,最多剩余的钱是容量
code
#include<bits/stdc++.h>
using namespace std;
int a[55][15]={0},dp[5000000]={0};//dp的含义是最多花i元,最多可以挣回多少元,起码是i,因为可以不花
int main()
{
int s,d,m;
cin>>s>>d>>m;
for(int i=1;i<=s;i++)
{
for(int j=1;j<=d;j++) cin>>a[i][j];
}
int maxm=m;
for(int i=2;i<=d;i++)
{
int add=0;
for(int i=1;i<=maxm;i++) dp[i]=i;//前一天留下来的不花
for(int j=1;j<=s;j++)
{
for(int k=a[j][i-1];k<=maxm;k++)//这里从小到大遍历,原因是可以多买; 这里的k是指花出去多少钱,maxm是指昨天最多赚了多少钱
{
dp[k]=max(dp[k],dp[k-a[j][i-1]]+a[j][i]);
add=max(dp[k]-maxm,add);
}
}
maxm+=add;
}
cout<<maxm;
return 0;
}

浙公网安备 33010602011771号